选择更新和 3 个用户

发布于 2024-11-19 17:25:01 字数 530 浏览 1 评论 0原文

我有这个代码并与 3 个用户进行测试,

<?php
mysql_query("BEGIN");
$r=mysql_query("SELECT max(Ticket) from ticket FOR UPDATE");
$row=mysql_fetch_row($r);
$k=$row[0];
echo $k;
for ($j=1;$j<100000;$j++) {
    $k++;
    $r=mysql_query("insert into ticket (Ticket) values ('$k')");
}
mysql_query("COMMIT");
?>

我希望看到这个结果

user1 0

user2 9999

user3 19998

,但我看到这个结果,

user1 0

user1 **9999**

user3 **9999**

似乎 user2 和 user3 同时运行代码,即使我选择更新

I have this code and test with 3 users

<?php
mysql_query("BEGIN");
$r=mysql_query("SELECT max(Ticket) from ticket FOR UPDATE");
$row=mysql_fetch_row($r);
$k=$row[0];
echo $k;
for ($j=1;$j<100000;$j++) {
    $k++;
    $r=mysql_query("insert into ticket (Ticket) values ('$k')");
}
mysql_query("COMMIT");
?>

I expect to see this result

user1 0

user2 9999

user3 19998

but i see this result

user1 0

user1 **9999**

user3 **9999**

it seems user2 and user3 run code at same time even if I have a select for update

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(1

婴鹅 2024-11-26 17:25:01

InnoDB在执行select ... for update时使用行级锁定,即只有现有行受到影响。

您需要的是 MySQL 的 AUTO_INCRMENT 功能。

InnoDB uses row-level locking when executing select ... for update, i.e. only existing rows are affected.

What you need is MySQL's AUTO_INCREMENT feature.

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