Transactions 将事务锁定为一行,以便在MariaDB上读取

Transactions 将事务锁定为一行,以便在MariaDB上读取,transactions,mariadb,isolation-level,Transactions,Mariadb,Isolation Level,我在隔离级别方面遇到了一些问题,并且一个事务遇到了竞争条件问题 我有一个带有状态字段的表,n个进程正在访问它。每个事务都应返回状态为1的最旧行,并将状态更改为2。理论上,2个进程不应该能够获得相同的注册表。但事实并非如此。因为该行未被事务锁定以进行读取 您可以在下面找到事务将执行的伪代码: 启动交易; 按状态为1的创建日期获取最早的行订单; 更新行并设置状态=2; 提交交易; 竞赛条件发生在2和3之间。因为该行未锁定以进行选择。在马里亚布有可能吗?玩隔离级别?这样做的成本是多少?您可以在一个更新

我在隔离级别方面遇到了一些问题,并且一个事务遇到了竞争条件问题

我有一个带有状态字段的表,n个进程正在访问它。每个事务都应返回状态为1的最旧行,并将状态更改为2。理论上,2个进程不应该能够获得相同的注册表。但事实并非如此。因为该行未被事务锁定以进行读取

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

启动交易; 按状态为1的创建日期获取最早的行订单; 更新行并设置状态=2; 提交交易;
竞赛条件发生在2和3之间。因为该行未锁定以进行选择。在马里亚布有可能吗?玩隔离级别?这样做的成本是多少?

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

UPDATE table SET field=value,.., status=2 WHERE status = 1 ORDER BY date_created DESC LIMIT 1
如果您需要执行更高级的操作,还可以选择进行更新。

这可能会加快查询速度,从而有助于避免锁定:

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

更新是不够的,因为我需要将行返回到代码中。但是选择更新应该可以工作。谢谢