我正在为一些个人项目评估 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;
任何想法如何在这种常见情况下避免死锁?
需要什么 - 只需使用“之前的余额”/“之后的余额”插入交易描述并更新余额。
它将用于高负载应用。如何针对这种简单的业务需求实现正确的结果?
谢谢你。
更新:
也许有任何其他解决方案来重新设计数据库以避免死锁或使用其他解决方案来解决业务需求?