我有一个将作业状态存储在 MySQL 数据库中的应用程序(最近从 DynamoDB 迁移)。我现在遇到的问题是后续查询无法立即看到更新,从而导致失败。这是流程,完全顺序,没有并发:
- an object in db has state X
- the object is updated to have state Y
- the object is retrieved and is expected to have state Y
- the retrieved object has state X, the task fails
根据我的了解,似乎有两种选择可以解决此问题:
在更新事务中将隔离级别设置为
可序列化
。使用
select ... for update
进行查询,锁定更新行。
虽然我不知道如何权衡这些选项,也许有人可以帮助我解决这个问题。
对于数据库接口(interface),我在 Go 中使用 gorm,没有花哨的自定义 sql 或任何东西。性能并不是真正的问题,数据集很小并且更新相对不频繁。由于经常查询状态字段,因此对其进行了索引。
最佳答案
由于您正在处理不同的事务:
MySql-innodb-engine 与 MVCC 配合使用。这意味着一旦启动事务,其对数据库的 View 在整个事务中就保持不变。即使并行运行的事务已完成,因此不会进行脏读,较早启动的事务也不会看到更改。
如果您牢记这一点,您可能会对奇怪的行为有一个解释,并可以采取确定性的操作来解决这个问题。
关于mysql - 如何保证事务在查询之前已在 MySQL 中提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47446785/