MySql:锁无效?

时间:2018-04-21 12:40:27

标签: mysql

我有一张桌子"提供"其中包含"订单"同样。优惠可以更改为"订单"通过添加唯一的增量订单号。

我做:

$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使一切更快。

知道为什么可以两次获得相同的数字?

1 个答案:

答案 0 :(得分:2)

您可以使用单个更新语句:

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

这样您就不需要手动锁定任何东西了。