使事务锁定一行以便在MariaDB上读取

时间:2018-04-25 15:47:38

标签: transactions mariadb isolation-level

我在ISOLATION级别和遇到竞争条件问题的交易方面遇到了一些麻烦。

我有一个带有状态字段的表,以及访问它的n进程。每个事务应返回status = 1的最旧行,并将状态更改为2.理论上,2进程不应该能够获得相同的注册表。但那并没有发生。由于该行未被锁定以供事务读取。

您可以在下面找到交易将执行的伪代码:

  1. 启动交易;
  2. 获取最旧的行(按date_created排序),状态= 1;
  3. 更新行并设置status = 2;
  4. 提交交易;
  5. 竞争条件发生在2到3之间。因为行未被选中锁定。在MariaDB中有可能吗?玩隔离级别?这样做的代价是什么?

2 个答案:

答案 0 :(得分:1)

您可以在一个UPDATE语句中完成所有操作,例如

 UPDATE table SET field=value,.., status=2
  WHERE status = 1
  ORDER BY date_created DESC
  LIMIT 1

还有SELECT FOR UPDATE,如果你需要做更好的事情。

答案 1 :(得分:0)

这可能会加快查询速度,以帮助避免锁定:

INDEX(status, date_created) -- in this order.