如何正确处理MySQL的货币交易?

时间:2018-01-30 16:04:12

标签: mysql transactions atomic

我有以下表格:

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个),并且两个账户都将更新以反映最新余额。

我的问题是如何使一切都是原子的,以避免无效的余额或重复。我不认为我可以使用MySQL事务,因为它们不能跨表工作 - 尤其是当一个语句失败并且我们需要回滚时。

我不确定如何实施这样的机制,以确保此功能是可靠的,并且在奇怪的角落情况下不会中断。

1 个答案:

答案 0 :(得分:0)

除非您可以控制整个堆栈,否则您无法确定插入的数据不是重复数据。在几家金融公司工作过,我的建议如下:

  1. 为每个帖子添加一个客户端ID,将其存储在数据库中,然后在新帖子中检查它。
  2. 仅插入(因此版本更新)并使用软删除。你永远不想删除纸质文件。
  3. 将货币作为十进制存储,而不是双重