我有一个应用程序,它将作业状态存储在MySQL数据库中(最近从DynamoDB迁移)。我现在遇到的问题是,后续查询无法立即看到更新,从而导致失败。这是流,完全顺序,没有并发:
- db中的对象具有状态X
- 将对象更新为状态Y
- 检索对象并期望其具有状态Y
- 检索到的对象具有状态X,任务失败
醇>
根据我所学到的,似乎有两种方法可以解决这个问题:
在更新事务中将隔离级别设置为serializable
。
使用select ... for update
进行查询,锁定更新中的行。
我不知道如何权衡选项,也许有人可以帮我解决这个问题。
对于db接口我在Go中使用gorm,没有花哨的自定义sql或任何东西。性能不是真正的问题,数据集很小,更新相对不频繁。状态字段已被索引,因为它经常被查询。
答案 0 :(得分:1)
由于您正在处理不同的交易:
MySql-innodb-engine适用于MVCC。这意味着只要您启动一个事务,它对数据库的视图对于完整的事务保持不变。即使并行运行的事务已完成,因此也不会进行脏读,但早期启动的事务将不会看到更改。
如果你牢记这一点,你可能会对这种奇怪的行为有一个解释,并且可以采取确定的行动来解决这个问题。