MySQL トランザクションに関連するこの問題をどのように修正すればよいのか、私は困っています。シナリオは複雑ですが、類似の状況は次のとおりです。1 対 1 の関係 (バインド テーブルを介して) を介してこれらの投稿にタグがバインドされた投稿テーブルがあります。それが3つのテーブルです。
私がやりたいことは、投稿の本文を「更新」することであり、コピーを作成することでこれを行います (改訂履歴を表示する必要があります)。そのため、投稿のコピーを作成し、それを posts テーブルに挿入し直して、重要なことに、すべてのタグ バインディングを古い投稿から新しい投稿に移動する必要があります。続いて、新しいタグ バインディングの新しい投稿を解析し、バインディング テーブルを介してそれらを新しい投稿にバインドします。
これらのすべての手順を確実に完了する必要があります。そうしないと、データベース内の整合性と一貫性が失われます。これらを REPEATABLE_READ 分離レベルで MySQL トランザクションにラップすると、根本的な問題が発生します。タグ バインディング テーブルへの更新は、チェーンのさらに下にある操作のいずれにもアクセスできません。
つまり、すべてのタグ バインディングを投稿 A から投稿 B に移動してから、新しいバインディングを投稿 A に挿入します。これは失敗する可能性があります。 INSERT/SELECT ステートメントは、トランザクション前のデータベースの状態を反映しています!)
一貫性を保証し、この問題を解決する方法がわかりません。分離レベルを READ_COMMITTED に下げることもできますが、ダーティ リードが発生し、トランザクションの分離が失われる可能性があります。
これはデザインパターンで解決できるものですか?アドバイスをいただければ幸いです。MySQL、PHP (PDO コネクタ) を使用しています。
乾杯、 エイドリアン