2

我正在为一些个人项目评估 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;

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

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

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

谢谢你。

更新:

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

4

1 回答 1

2

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

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

于 2012-07-30T20:56:46.573 回答