ユーザーの勘定残高を保持するフィールドがユーザーテーブルにあります。ユーザーは自分のサービスで多くのアクションを実行することができ、その結果、バランスが急速に変化します。mysqlによる勘定残高の更新
私は、複数のユーザアクションが値を間違って更新しないようにするために、シリアライズ可能なアイソレーションレベルを使用しようとしています。 (アクションAとアクションBは同時に天びんから1ドルを差し引きたいと思っています。)しかし、デッドロック・エラーが多く発生しています。
これらのデッドロックをすべて取得せずに残高フィールドを最新の状態に保つことなく、正しく行うにはどうすればよいですか?
シンプルなスキーマ:ユーザーにはIDと残高があります。
教義を使用してイムので、私は、次のようなものをやっている:あなたのトランザクションにシリアライズ可能な分離レベルを使用しようとして
$con->beginTransaction();
$tx = $con->transaction;
$tx->setIsolation('SERIALIZABLE');
$user = UserTable::getInstance()->find($userId);
$user->setBalance($user->getBalance() + $change);
$user->save();
$con->commit();
スキーマを提供し、選択、更新、すべてがトランザクション的に行われるパターンへのアクセスを提供した場合は、問題に対処する方が簡単です。 – atxdba
が更新しました。 –