MySQL 事务是原子的吗?

发布于 2024-11-27 02:35:30 字数 342 浏览 0 评论 0原文

我读过 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤千羽 2024-12-04 02:35:30

您应该查看更新<在这种情况下, /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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文