for update (排他锁)
目的是在执行这个 select 查询语句的时候,会将对应的索引访问条目进行上排他锁(X 锁),也就是说这个语句对应的锁就相当于update带来的效果。
查询到的记录不允许别的事务再更新和加锁。
lock in share mode(共享锁)
目的是在执行这个select查询语句时,会将对应的索引条目进行上share锁。
当前事务上所之后,别的事务也可以对这些记录上share锁,但不允许上排他锁,更不允许更新。
锁定范围
可能锁住全表,也可能锁住部分记录
当查询语句对应的结果的主键不明确时,会锁住全表。
当查询语句对应的结果主键明确时,只会锁住查询到的记录。
具体的是否锁住了全表可以开启两个窗口,每个窗口中开启一个事务,模拟上锁过程来观察。
区别
很显然,for update控制的更严格。
业务场景中,如果只需要保证当前事务读取到的数据不会被修改,可以使用共享锁。如果当前事务需要修改查询到的记录,不能使用共享锁,因为其他事务可能也会占用共享锁而导致当前事务无法修改。这种场景需要使用for update。
这两种锁在使用过程中都需要即使释放,否则后续的相关操作都会被堵塞。
网友评论