4

私が正しければ、PDO トランザクションは実際にはトランザクションではありません。自動コミットをオフにするだけです (ドキュメントを参照)。

したがって、行を削除するトランザクション A と同じ行を変更するトランザクション B がある場合、次のことが発生する可能性があります。

  1. トランザクション A が開始され、自動コミットがオフになります。
  2. トランザクション B が開始され、自動コミットがオフになります。
  3. トランザクション A が行を削除します。
  4. トランザクション B は同じ行を変更します。
  5. トランザクション A が終了し、変更をコミットします。
  6. トランザクション B が終了し、変更をコミットします。

しかし、ステップ 6 では、行はステップ 5 で既に削除されています。

また、トランザクション A がコミットされるまでトランザクション B を確実にブロックするにはどうすればよいですか? 参考までに、私は innoDB で mysql で PDO を使用しています。

ありがとうございました。

4

1 に答える 1

0

@eggyal が指摘したように、トランザクションは同時に発生する可能性がありますが、DELETE ステートメントは、トランザクションがコミットされるまで行に排他ロックを設定するため、トランザクション A がコミットされるまで、トランザクション B はステップ 4 で自動的にブロックされます。排他ロックは、すべての書き込みと読み取りをブロックします。

于 2013-06-05T00:15:57.497 に答える