2

個人的なプロジェクトで 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;

このような一般的なケースでデッドロックを回避する方法はありますか?

必要なもの - 「前の残高」/「後の残高」でトランザクションの説明を挿入し、残高を更新するだけです。

高負荷用途で使用されます。この単純なビジネス ニーズに対して適切な結果を得るにはどうすればよいでしょうか。

ありがとうございました。

アップデート:

デッドロックを回避するためにデータベースを再設計するか、ビジネス ニーズを解決し続けるために他のソリューションを使用する他のソリューションがあるでしょうか?

4

1 に答える 1

2

更新を最初に置き、両方のステートメントをトランザクションに含めます。更新により、ベンダー行がアップロックされ、同時トランザクションがトランザクションに入るのが防止されます(アップドロックが使用できないため、最初のトランザクションが完了するまで待機します)。

これにより、特定のベンダーへのアクセスが効果的にシリアル化され、一貫性が確保されます。

于 2012-07-30T20:56:46.573 に答える