中文直译的意思是:用于更新。
理解:这次查询的数据我要用于更新操作,所以麻烦Mysql帮我加锁,其他进程在我更新完成之前不能发起for update请求(可以发起普通select请求, 用于前端展示)
用途:防止高并发情况下,比如用户连续快速点击两次购买,导致商品数量超卖 为负数等情况
1.一个连接A 发起事务,执行select for update
START TRANSACTION;
select * from test where id = "Auth" for update;
2.另一个连接B 发起普通select请求,正常返回结果
3.连接B 发起select for update请求,由于第一个步骤的事务还没有结束,所以不能获取,会一直堵塞,直到超时 或者锁被释放后返回
4.没有nowait 可以封装如下逻辑
function testNowait(){
// 执行sql 超时时间更改为0.5s
// 执行for update
// 0.5s后则返回失败(默认可能长达1分钟)
// 恢复为默认的超时时间,避免影响其他sql执行
}