個人的なプロジェクトで PostgreSQL を評価しています。Multi-Version Concurrency Control (MVCC) に触発されました
基本的なニーズをシミュレートしました。トランザクションを挿入し、同時に多くのスレッドでベンダー残高の更新を実行し、次のような SQL コマンドを実行します。
INSERT INTO
VendorAccountTransactions (VendorId, BalanceBefore, BalanceAfter)
VALUES (
1,
(SELECT CurrentBalance FROM VendorAccounts WHERE VendorId = 1),
(SELECT CurrentBalance FROM VendorAccounts WHERE VendorId = 1) + 19.99
);
UPDATE VendorAccounts SET CurrentBalance = CurrentBalance + 19.99 WHERE VendorId = 1;
このような一般的なケースでデッドロックを回避する方法はありますか?
必要なもの - 「前の残高」/「後の残高」でトランザクションの説明を挿入し、残高を更新するだけです。
高負荷用途で使用されます。この単純なビジネス ニーズに対して適切な結果を得るにはどうすればよいでしょうか。
ありがとうございました。
アップデート:
デッドロックを回避するためにデータベースを再設計するか、ビジネス ニーズを解決し続けるために他のソリューションを使用する他のソリューションがあるでしょうか?