我有一张桌子"提供"其中包含"订单"同样。优惠可以更改为"订单"通过添加唯一的增量订单号。
我做:
$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使一切更快。
知道为什么可以两次获得相同的数字?
答案 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
这样您就不需要手动锁定任何东西了。