我有下表:
CREATE Account (id INTEGER, balance DECIMAL(13, 4))
CREATE Transaction (id INTEGER, user INTEGER, balance DECIMAL(13, 4), amount DECIMAL(13, 4), peer INTEGER)
因此,当用户向其同伴转账时,系统中将会有 2 笔交易(每笔 1 笔),并且两个帐户都会更新以反射(reflect)最新余额。
我的问题是如何使一切原子化,以避免无效余额或重复。我不认为我可以使用 MySQL 事务,因为它们不能跨表工作 - 特别是当一个语句失败并且我们需要回滚时。
我不知道如何实现这样的机制来确保这个功能是可靠的并且不会在奇怪的极端情况下崩溃。
最佳答案
除非您可以控制整个堆栈,否则您无法确定插入的数据不是重复的。我曾在多家金融公司工作过,以下是我的建议:
- 为每个帖子添加一个客户端 ID,将其存储在数据库中,然后在新帖子中检查它。
- 仅插入(因此版本更新)并使用软删除。你永远不想删除书面记录。
- 将钱存储为小数,而不是双倍
关于mysql - 如何使用MySQL正确处理金钱交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48525737/