我有一个表“ offers”,其中也包含“ orders”。通过添加唯一的递增订单编号,可以将要约更改为“订单”。
我做:
$DB->Sql("SELECT GET_LOCK('ORDERNO')");
$n = $DB->resultSql("SELECT max(orderno) FROM orders");
$n += 1;
$DB->Sql("UPDATE orders SET orderno=".$n." WHERE id=".$actualId);
$DB->Sql("SELECT RELEASE_LOCK('ORDERNO')");
但最近,我得到了两个相同的订单号。
我想避免使用
SELECT max(orderno) FOR UPDATE
因为这会阻塞整个表,并且仅在代码的这一部分中设置orderno,所以我的想法是使用LOCKS来使一切变得更快。
知道为什么可以两次获得相同的数字吗?
最佳答案
您可以使用一个更新语句:
update orders t
cross join (select max(orderno) as maxno from orders) x
set t.orderno = x.maxno + 1
where id = ?;
演示:http://rextester.com/GEJHX43916
这样,您无需手动锁定任何内容。
关于mysql - MySql:锁定无效吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49955871/