我有一个表“ 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/

10-12 17:31