7

この状況を考えてみましょう。

  1. トランザクションを開始します
  2. auto_incrementキーを使用して20レコードをテーブルに挿入します
  3. 最初の挿入IDを取得します(たとえば153
  4. そのテーブル内のすべてのレコードを更新します。id >= 153
  5. 専念

ステップ4は安全ですか?

つまり、別のリクエストがほぼ同時に着信し、上記のステップ2の後、ステップ4の前にさらに20レコードを挿入した場合、競合状態は発生しますか?

4

2 に答える 2

8

つまり、別のリクエストがほぼ同時に着信し、上記のステップ2の後、ステップ4の前にさらに20レコードを挿入した場合、競合状態は発生しますか?

はい、そうなります。

対象のレコード2140トランザクションによってロックされ2ます。

トランザクションはブロックされ、トランザクションがコミットまたはロールバック1されるまで待機します。2

トランザクション2がコミットすると、トランザクションはレコード(トランザクションによって挿入されたレコードを含む)を1更新します402

于 2010-05-11T07:36:54.153 に答える
0

これは競合状態としてではなく、DMBS固有の動作としてカタログ化できると思います。基本的に、DBMSが新しく挿入されたレコードをロックする場合、最初のトランザクションは、2番目のトランザクションがコミットされるまで2番目のトランザクションのレコードを参照しません。

そしてもちろん、テーブルをロックするという問題もあります。最初のトランザクションがテーブルを書き込みロックすると、最初のトランザクションが完了するまで、2番目のトランザクションは書き込みでブロックされます。ただし、標準のmysqlがこの種の機能を提供しているかどうかはわかりません。私はそれが行うMSSQLサーバーを知っています。

于 2013-08-30T19:06:38.150 に答える