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

标签 mysql database transactions locking

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

  1. an object in db has state X
  2. the object is updated to have state Y
  3. the object is retrieved and is expected to have state Y
  4. the retrieved object has state X, the task fails

根据我的了解,似乎有两种选择可以解决此问题:

  1. 在更新事务中将隔离级别设置为可序列化

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

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

对于数据库接口(interface),我在 Go 中使用 gorm,没有花哨的自定义 sql 或任何东西。性能并不是真正的问题,数据集很小并且更新相对不频繁。由于经常查询状态字段,因此对其进行了索引。

最佳答案

由于您正在处理不同的事务:

MySql-innodb-engine 与 MVCC 配合使用。这意味着一旦启动事务,其对数据库的 View 在整个事务中就保持不变。即使并行运行的事务已完成,因此不会进行脏读,较早启动的事务也不会看到更改。

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

关于mysql - 如何保证事务在查询之前已在 MySQL 中提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47446785/

相关文章:

database - 我们可以要求 postgres 对特定表使用缓存吗?

javascript - 通过在另一台主机上打开 php 文件从 mysql 数据库中获取值(数组)

mysql - 如何提高Mysql select from big table的速度?

database - 如何使用 MongoDB 通过传递一个必须至少在文档的特定范围之一内的数字来查找文档?

mysql - 没有锁表的 MySQL

firebase - 如何在发生错误时中止 Firestore 事务

mysql - 显示基于多列的所有重复记录

mysql - 存储过程中的错误 - 列计数与值不匹配

mysql - 需要重写查询以选择辅助表中的多条记录

mysql - 冲突的事务会导致奇怪的行为