mysql - 如何使用MySQL正确处理金钱交易?

标签 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 笔),并且两个帐户都会更新以反射(reflect)最新余额。

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

我不知道如何实现这样的机制来确保这个功能是可靠的并且不会在奇怪的极端情况下崩溃。

最佳答案

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

  1. 为每个帖子添加一个客户端 ID,将其存储在数据库中,然后在新帖子中检查它。
  2. 仅插入(因此版本更新)并使用软删除。你永远不想删除书面记录。
  3. 将钱存储为小数,而不是双倍

关于mysql - 如何使用MySQL正确处理金钱交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48525737/

相关文章:

php - 将带有另一个搜索查询的变量添加到 MySQL SELECT 语句中

php - mysqli - 可以获取事务中之前两个查询的 insert_id 吗?

UNIX 自动交换或替换目录?

mysql - 如何创建一个规则以在 bool 列中的许多假之间只接受一个真?

将 MySQL 查询转换为 CSV 的 PHP 代码

mysql - 交易陷阱 22

linux - Intel-64 和 ia32 原子操作获取-释放语义和 GCC 5+

c# - "switch"语句评估线程安全吗?

php - 从第一个下拉列表中选择值后,在第二个下拉列表中显示值

c# - 正确使用 Entity Framework 事务进行隔离