在查询之前,如何保证在MySQL中提交事务?

时间:2017-11-23 02:49:26

标签: mysql database transactions locking

我有一个应用程序,它将作业状态存储在MySQL数据库中(最近从DynamoDB迁移)。我现在遇到的问题是,后续查询无法立即看到更新,从而导致失败。这是流,完全顺序,没有并发:

  
      
  1. db中的对象具有状态X
  2.   
  3. 将对象更新为状态Y
  4.   
  5. 检索对象并期望其具有状态Y
  6.   
  7. 检索到的对象具有状态X,任务失败
  8.   

根据我所学到的,似乎有两种方法可以解决这个问题:

  1. 在更新事务中将隔离级别设置为serializable

  2. 使用select ... for update进行查询,锁定更新中的行。

  3. 我不知道如何权衡选项,也许有人可以帮我解决这个问题。

    对于db接口我在Go中使用gorm,没有花哨的自定义sql或任何东西。性能不是真正的问题,数据集很小,更新相对不频繁。状态字段已被索引,因为它经常被查询。

1 个答案:

答案 0 :(得分:1)

由于您正在处理不同的交易:

MySql-innodb-engine适用于MVCC。这意味着只要您启动一个事务,它对数据库的视图对于完整的事务保持不变。即使并行运行的事务已完成,因此也不会进行脏读,但早期启动的事务将不会看到更改。

如果你牢记这一点,你可能会对这种奇怪的行为有一个解释,并且可以采取确定的行动来解决这个问题。