我有以下交互(伪代码):
start transaction
select delivery for update # semaphore
select delivery_items where processed = false # get unprocessed data and process it
update delivery_items SET processed = true
commit # release semaphore
我原以为这足以锁定交付,以便没有两个人能够同时对其项目执行操作,但由于某种原因,我遇到了两个人确实设法修改的竞争条件(我delivery_items
是将相同的项目处理两次)。
我没有正确理解 ACID 吗?
在另一个用户完成事务之前,第一个选择是否应该阻止第二个选择和更新之间的提交阻止竞争条件?
所有 MySQL 设置都设置为默认值(某些内存池大小除外)。
如果这有什么不同的话,我正在使用 Doctrine。
我也在使用嵌套事务(doctrine 使用SAVEPOINT
s 实现它们)。