• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2人のユーザーが同時アクセス時のトランザクション)

2人のユーザーが同時アクセス時のトランザクションで発生する問題と解決方法

このQ&Aのポイント
  • 2人のユーザーが同時アクセスした際に、mysqlデータベースにおいてAtomicity(原子性)が保たれない現象が発生することがあります。
  • 問題の現象は、同じレコードに対して行われるトランザクションの途中で中途半端な値を読み込んでしまうことです。
  • この問題は排他ロックをかけることやトランザクションのタイムアウトを設定することで解決することができます。

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

  • ベストアンサー
  • bugmaker
  • ベストアンサー率63% (12/19)
回答No.1

なんとなくですがBのコミット完了前にAが読みに行ってませんか? stateにはロックをかけるのに対しanswerにはかけていませんがその辺も確認したほうが良いかと思います。 Mysqlのリファレンスです。 ロック関連の問題 http://dev.mysql.com/doc/refman/5.1/ja/locking-issues.html これは検索でヒットしたブログですが参考になるかもしれません http://ikm.hatenablog.jp/entry/2012/12/10/192346

ankodaisuki
質問者

お礼

stateがFOR UPDATEにより最新のものを読み込んでいるのに対し、answerはスナップショットを読んでいてその違いが原因でした。 ありがとうございました。

ankodaisuki
質問者

補足

stateはSELECT FOR UPDATEにより行ロックをかけているので「A : state=3を読み込み確認 // 問題」に来た時点でBのCOMMITは既に完了したものと推測しています。もし完了していなければ待たされているはずです。 answerは確かにロックしていませんが、この場合順番がstateのほうが先なので問題ないと思っています。 という考えなのですがいかがでしょうか。 (リンクはとても参考になりました) ただちょっと思ったのはBのCOMMITがmysqlの内部的に行われているときstateのロックは外れたけど、まだCOMMIT作業は終わってなくてanswerを読んでしまっている、つまり全然アトミックでない、というまずあり得なさそうな想像もしています。 あとはトランザクションの開始がAとBでかぶっているのでその辺に問題があるのかなどです。

関連するQ&A