SELECT ** FOR UPDATE 必须只有主键才管用吗?给定索引也不行?

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。两个都成功?

阅读 10.2k
3 个回答

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
继续

你这是什么逻辑,A如果对这行加了行锁,B对这行的修改操作会阻塞,直到A提交,B才会执行。

select for update 是通过聚集索引或者二级索引加锁;通过主键加锁,只锁定一行;如果是二级索引加锁,会对一定范围内的记录加上锁

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏