これには簡単な解決策があると確信していますが、今のところ見つけることができていません。分離レベルがSERIALIZABLEに設定されたInnoDBMySQLデータベースを提供し、次の操作を実行しました。
BEGIN WORK;
SELECT * FROM users WHERE userID=1;
UPDATE users SET credits=100 WHERE userID=1;
COMMIT;
トランザクション内のselectが発行されるとすぐに、userID = 1に対応する行が、トランザクションが完了するまで読み取り用にロックされていることを確認したいと思います。現在のところ、この行へのUPDATEは、トランザクションが進行中の場合はトランザクションが終了するのを待ちますが、SELECTは単に前の値を読み取ります。これがこの場合の予想される動作であることは理解していますが、トランザクションが終了して値を返すまでSELECTが待機するように行をロックする方法があるのでしょうか。
私がそれを探している理由は、ある時点で、十分な同時ユーザーがいるときに、前のトランザクションが進行中に、他の誰かが「クレジット」を読み取って他の何かを計算する可能性があるためです。理想的には、他の誰かが実行するコードは、トランザクションが終了して新しい値を使用するのを待つ必要があります。そうしないと、不可逆的な非同期の問題が発生する可能性があります。
テーブル全体を読み取り用にロックしたくはなく、特定の行だけをロックしたいことに注意してください。
また、ブール値の「ロックされた」フィールドをテーブルに追加して、トランザクションを開始するたびに1に設定することもできますが、他に方法が絶対にない限り、これがここで最もエレガントなソリューションであるとは思えません。 mysqlを介してこれを直接処理します。