SELECT ** FOR UPDATE
必须只有主键才管用吗?给定索引也不行?
像 select user_id from orders where order_no = :no for update
是拿不到锁的吗? order_no
是唯一索引。
select user_id from orders where id = (select id from orders where order_id = :no) for update
只能这样了吗?
另外一个问题:
FOR UPDATE是写锁(其他session可读)。那还有什么意义
A,B都同时select,获取的数据(money)都是1,A 把money-1 update 成了 0,B把1-1也update成0。两个都成功?
select for update 语句只需要有索引就能工作
它会阻塞其他的语句对涉及到的记录的修改。
money =0
如果A执行select for update, B执行select for update, B阻塞
A 修改money = 1
A commit
然后这时, B 的select for update 返回,查询该行 money = 1
继续