• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:同時アクセスについて)

同時アクセスについて

このQ&Aのポイント
  • mysqlでトランザクションを使いたいです
  • MyISAMを使ってきましたが、InnoDBに変更するだけで同時アクセスが可能になるのでしょうか?
  • pdoでUPDATE文を実行する際には何か特別な処理が必要でしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.3

画像小さくなっちゃったのでこっちで↓ http://qiita.com/mpyw/items/b00b72c5c95aac573b71#4-13

flash0
質問者

お礼

見やすかったです 簡単な加算だとなしでもいいのですね。勉強になりました。ありがとうございます

その他の回答 (2)

noname#244856
noname#244856
回答No.2

素晴らしい記事を見つけました。 MySQLのトランザクション分離レベル http://tree-tips.appspot.com/mysql/transaction_isoration/ ロストアップデートの有無を見るためのスクリプトを2つ用意します。point_tableにあらかじめレコードを1つだけ入れておいてください。Aを実行後10秒以内にBを実行し、2つのスクリプトがどちらも実行完了したあとの結果がどうなるかを、「//」のコメントアウトがある場合と無い場合で比較してみてください。 [スクリプトA] // $pdo->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE'); $pdo->beginTransaction(); $point = $pdo->query('SELECT point FROM point_table')->fetchColumn(); sleep(10); $pdo->exec('UPDATE point_table SET point = ' . ++$point); $pdo->commit(); [スクリプトB] // $pdo->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE'); $pdo->beginTransaction(); $pdo->exec('UPDATE point_table SET point = point + 100'); $pdo->commit(); RepeatableReadの方では「+1」、Serializableの方では「+101」される結果になると思います。ただしこのようにSerializableレベルでトランザクション分離が必要になるケースは非常に稀です。「同時アクセス」という言葉でくるめてしまわずに、自分が必要としている最低限度のレベルを探してみてください。むしろ単純に加減算する程度ならばトランザクション処理の必要性すら無くなったりします。

flash0
質問者

お礼

回答ありがとうございます トランザクションもいろいろレベルがあるのですね 自分が考えていたよりも奥が深かったのです(汗

noname#244856
noname#244856
回答No.1

毎度毎度になりますがまとめ貼りますね(笑) Qiita - PHPでデータベースに接続するときのまとめ #トランザクション処理 http://qiita.com/mpyw/items/b00b72c5c95aac573b71#2-22 InnoDBは4レベルのトランザクション分離をサポートしており、一番安全なようにアクセスごとに完全分離させたいならば $pdo->exec('SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE') を実行してください。

flash0
質問者

お礼

回答ありがとうございます なんとか出来た?と思うのですが、見た目が変わらないのでなんともいえません トランザクションが成功しているか確認する方法はありますか?