选择更新和 3 个用户
我有这个代码并与 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
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.