この状況を考えてみましょう。
- トランザクションを開始します
- auto_incrementキーを使用して20レコードをテーブルに挿入します
- 最初の挿入IDを取得します(たとえば
153
) - そのテーブル内のすべてのレコードを更新します。
id >= 153
- 専念
ステップ4は安全ですか?
つまり、別のリクエストがほぼ同時に着信し、上記のステップ2の後、ステップ4の前にさらに20レコードを挿入した場合、競合状態は発生しますか?
この状況を考えてみましょう。
153
)id >= 153
ステップ4は安全ですか?
つまり、別のリクエストがほぼ同時に着信し、上記のステップ2の後、ステップ4の前にさらに20レコードを挿入した場合、競合状態は発生しますか?
つまり、別のリクエストがほぼ同時に着信し、上記のステップ2の後、ステップ4の前にさらに20レコードを挿入した場合、競合状態は発生しますか?
はい、そうなります。
対象のレコード21
は40
トランザクションによってロックされ2
ます。
トランザクションはブロックされ、トランザクションがコミットまたはロールバック1
されるまで待機します。2
トランザクション2
がコミットすると、トランザクションはレコード(トランザクションによって挿入されたレコードを含む)を1
更新します40
2
これは競合状態としてではなく、DMBS固有の動作としてカタログ化できると思います。基本的に、DBMSが新しく挿入されたレコードをロックする場合、最初のトランザクションは、2番目のトランザクションがコミットされるまで2番目のトランザクションのレコードを参照しません。
そしてもちろん、テーブルをロックするという問題もあります。最初のトランザクションがテーブルを書き込みロックすると、最初のトランザクションが完了するまで、2番目のトランザクションは書き込みでブロックされます。ただし、標準のmysqlがこの種の機能を提供しているかどうかはわかりません。私はそれが行うMSSQLサーバーを知っています。