mysql - 在 mysql db 中处理竞争条件
问题描述
我正在创建一个包含一些信用卡和借记卡交易的钱包。
数据库架构:
在每个借记请求中,我都会检查借记金额是否小于或等于我钱包中的总金额。总金额将是所有贷方的总和,并将从中减去所有借方的总和。信用可以正常工作,因为我没有在表中保存任何总金额,因此不会发生竞争条件。但是在借记时,我需要获取总金额并对其进行一些验证,然后创建一个新的借记条目。
我想到的一个解决方案是为借记设置一个钱包锁,即当一个借记请求到来时,我将锁定它并将其保存在内存中,当另一个借记请求到来时,我将检查锁。
有没有更好的解决方案。我想到的另一个解决方案是表行锁,但我不确定是否可以将它用于我的情况。
请为此提供更好和体面的解决方案。提前致谢。
解决方案
BEGIN;
a bunch of UPDATEs to subtract money from one place and add it to another.
if overdrawn, ROLLBACK
else COMMIT
您可能需要更多帮助来避免死锁:
BEGIN;
SELECT ... FOR UPDATE; -- the rows you need to look at and may need to update
... (tests)
UPDATE ... -- subtract money from here
UPDATE ... -- add that money to there
COMMIT;
确保在每一步都检查错误。
推荐阅读
- azure-functions - 天蓝色函数中的MongoDB连接关闭错误
- python - 数据框列和索引的组合
- javascript - 标记每个用户的移位时钟干扰
- javascript - React - 无法读取用户名/密码的状态
- c++ - 与任何类型的函数的接口
- java - 由于 InputStream.read(byte[] b) 是一种缓冲读取方法,它是否共享 BufferedInputStream 的效率?
- spring-integration - Spring Integration TCP Inbound Adapter 客户端断开连接问题
- bootstrap-4 - 背景和文本颜色导航栏 Blazor
- arrays - 访问 VBA 函数中的单个数组元素
- python-3.x - mplfinance KeyError:'打开'