MySQL 事务是原子的吗?
我读过 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'];
I have read that transactions are atomic in MySQL (InnoDB) but when I test the next code in 5 threads they select the same 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'];
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您应该查看
更新<在这种情况下, /code>
关键字。
简单的选择不会锁定选定的行,因此您在示例中看到的内容是完全正常的。
You should have a look at the
FOR UPDATE
keyword in this scenario.A simple select will not lock the selected rows, so what you are seeing in your example is perfectly normal.