これは単純な解決策があるとはかなり確信していますが、これまでこれを見つけることはできませんでした。 SERIALIZABLEに設定分離レベルでのInnoDBのMySQLデータベースを提供し、次の操作与えられた:トランザクション中に、トランザクションが完了するまで、影響を受ける行への読み取りはどのように防止できますか?
BEGIN WORK;
SELECT * FROM users WHERE userID=1;
UPDATE users SET credits=100 WHERE userID=1;
COMMIT;
は、私は、すぐにトランザクション内の選択が発行されるように、行はユーザーIDに対応していることを確認したいと思いますし= 1はトランザクションが完了するまでがロックされ、と読み込まれます。今のように、この行のUPDATEは、トランザクションが処理中であれば終了するのを待っていますが、SELECTは単に前の値を読み込みます。私はこれがこの場合の予想される動作だと理解していますが、SELECTがトランザクションが値を返すために終了するまで待つような方法で行をロックする方法があるのだろうか?
私が探している理由は、ある時点で十分な同時ユーザーがいるため、以前のトランザクションが処理中に他のユーザーが他のユーザーが計算するために「クレジット」を読み取ることがあります。理想的には、他の誰かが実行するコードは、トランザクションが新しい値を使用するのを待つ必要があります。そうしないと、不可逆的な非同期の問題が発生する可能性があります。
テーブル全体を特定の行だけロックする必要はありません。
また、テーブルにブール値の「ロックされた」フィールドを追加して、トランザクションを開始するたびに1に設定することもできますが、絶対にそうでない限り、これをmysqlを通して直接処理する他の方法はありません。
テーブルのスナップショットを一時テーブルに入れることができます: 'CREATE TEMPORARY TABLE t_users SELECT * FROM users;'。 – eggyal
それはしないだろう、私はトランザクションが進行中に特定の行への読み込みが拒否されていることを確認したい、私はメインテーブルから行を削除し、私が終わった後、それはあまりにも多くのDBへの旅行のように聞こえる。 – Mahn
私の悪い、私はあなたの質問に誤解していた。 – eggyal