postgre避免CurrentAccountBalance更新时出现SQL死锁



我正在为一些个人项目评估PostgreSQL。它的多版本并发控制(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;

你知道在这种常见的情况下如何避免死锁吗?

需要什么-只需插入带有"之前余额"/"之后余额"的交易描述,然后更新余额。

它将用于高负载应用。如何为这种简单的业务需求实现正确的结果?

谢谢。

更新:

也许还有其他解决方案可以重新设计数据库以避免死锁,或者使用其他解决方案来解决业务需求?

将更新放在第一位,并将这两条语句都包含在事务中。更新将更新供应商行,并防止并发事务进入事务(由于更新块不可用,它们将等待第一个事务完成)。

这将有效地序列化对给定供应商的访问,从而确保一致性。

最新更新