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

时间:2012-07-30 20:00:28

标签: sql postgresql postgresql-9.1

我正在评估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;

任何想法如何在这种常见情况下避免死锁?

需要什么 - 只需在“之前的余额”/“余额之后”插入交易描述并更新余额。

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

谢谢。

更新

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

1 个答案:

答案 0 :(得分:2)

首先放置更新,并在事务中包含这两个语句。更新将更新供应商行并阻止并发事务进入事务(它们将等到第一个tran完成,因为updlock不可用)。

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