我在ISOLATION级别和遇到竞争条件问题的交易方面遇到了一些麻烦。
我有一个带有状态字段的表,以及访问它的n进程。每个事务应返回status = 1的最旧行,并将状态更改为2.理论上,2进程不应该能够获得相同的注册表。但那并没有发生。由于该行未被锁定以供事务读取。
您可以在下面找到交易将执行的伪代码:
竞争条件发生在2到3之间。因为行未被选中锁定。在MariaDB中有可能吗?玩隔离级别?这样做的代价是什么?
答案 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.