MySQL事务是原子性的吗?

3

我了解到MySQL(InnoDB)中的事务是原子性的,但当我在5个线程中测试下面的代码时,它们选择相同的ID:

$db->beginTransaction();

$row = $db->fetchRow("SELECT * FROM atomic WHERE selected = 0 LIMIT 1");

sleep(5);

$db->update("atomic", array('selected' => 1), "id = " . $row['id']);

$db->commit();

echo "Selected row: " . $row['id'];

1
我认为你在询问表锁定,而不是原子性... - Álvaro González
没错,谢谢。 - Wiliam
我猜在所有的线程中,变量 $row 在上一个线程提交执行之前就被赋值了。 - Amit S
1个回答

5
在这种情况下,您应该查看FOR UPDATE关键字。简单的选择不会锁定所选行,所以您在示例中看到的是完全正常的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接