現在、別のセッションによってトランザクションでテーブルまたはテーブル行が使用されているかどうかを確認する方法はありますか?
2 に答える
コミットされる前に変更を検出できると、ACID の概念全体が損なわれます。
通常、テーブルまたは行が現在トランザクションに関与している場合、それらはロックされ、変更できません。表示しようとすると、コミットされていない変更が行われる前の状態で表示されます。これは、トランザクションの寿命を短くする正当な理由です (たとえば、ユーザー入力を待っている間は行をロックしないでください)。
更新の場合、トランザクションに時間がかかりすぎる場合、最終的に表示されるのはタイムアウトです (構成されていると仮定します)。
それが ACID の要点です。すべての変更が表示されるか、まったく表示されないかのどちらかです。部分的な変更が表示されるポイントはなく、事前に知るユース ケースはほとんどありません。
私が提案したいのは、あなたの質問を再考することです。特定の方法で何かを修正する方法を尋ねることは、あなたにとって逆効果です。実際の問題を述べ、それを修正する方法を尋ねる必要があります。そうすることで、背景をよりよく理解できるようになり、考えられる解決策の小さなサブセットに限定されることがなくなります。
lock monitorを有効にすると、SHOW ENGINE INNODB STATUS を使用してトランザクションの未処理の行ロックを実際に表示できますが、結果を解析して使用可能なものを取得する必要があります。これらのロックは通常、一時的なものです。トランザクションがコミットされると、それらは消えます。
クエリをシリアル化しようとしている場合は、(テーブル全体に対して) テーブル ロックを実装するか、(InnoDB を使用して) SELECT ... LOCK IN SHARE MODE を使用して行レベル ロックを実装できます (または、MySQL にこれを実行させることができます)。SERIALIZABLE分離モード) 。
データベースに格納された値を使用して、独自のロック スキームを考え出すこともできます。
デフォルトのinnodb_lock_wait_timeoutは 50 秒で、InnoDB のすべての行レベル ロックに適用されます。テーブル ロックのロック待機タイムアウトはありません。
実際のシナリオと望ましい動作を提供するなど、より具体的な場合は、より詳細に回答できます。