MySQLの二重支出の問題を処理するための推奨される方法は何ですか?MySQLのトランザクションと二重支出
- スタート
- 保証さが
A
がbalance >= $x
$x
バランスのB
に- を追加しているアカウントの取引:言う、例えば、私はそうのよう
B
に口座A
から$x
を転送するアプリケーションを持っていますDeduct$x
A
の残高 - コミット(またはクエリが失敗した場合はロールバック)
$x
をA
からB
に転送するために、2つの同一のトランザクションが同時に実行されるシナリオを検討しています。 A
の残高が少なくとも$x
である限り、いずれの取引もまだ残高を更新していないため、ステップ#2のチェックは各取引に合格します。これにより、攻撃者はA
の残高全体に対して2つの取引を発行し、両方を実行させることができるため、口座の残高を2倍にすることができます。
これに対抗するための推奨方法は何ですか?これを防ぐには、MySQLの隔離レベルをREPEATABLE_READ
に設定すれば十分でしょうか?あるいは、Aの残高から差し引くクエリにWHERE balance > $x
句が含まれていることを確認し、影響を受ける行がない場合はトランザクションをロールバックすることができます。しかし、私は理想的には、これをDBMSレイヤーで処理したいと思っています。
ありがとうございます!
[mySQLトランザクション対ロックテーブル](http://stackoverflow.com/questions/4226766/mysql-transactions-vs-locking-tables)の可能な複製 –
リンクされた質問のすべての回答を確認してください。 –
手順3と4を逆に開始します。 –