一、读锁(共享锁/Share Locks,S锁)。
1、select * from table_name where ... lock in share mode。(事务A)
(1)这种方式是获取指定记录行的读锁,那么这些记录行可以被其他事务获取读锁,但是这些行一定会拒绝被其他事务获取写锁,如果其他事务尝试获取这些记录行的写锁,那么只有当这些记录行的所有读锁都释放了才能获取到写锁,这期间一直处于阻塞状态。因此只允许在所有会话之间共享,不能被任何会话独占;
(2)如果现在事务A执行更新update/删除delete这些被自己加了读锁的记录行时,是否更新update/删除delete成功根据情况而定。如果执行更新update/删除delete时这些记录行如果还没有被其他事务获取读锁,那么执行更新update/删除delete成功;如果执行更新update/删除delete时这些记录行已经被其他事务获取读锁,而且不释放,那么执行更新update/删除delete失败。
(3)因此,在事务A中添加指定记录行的读锁的作用:防止事务A执行期间这些记录行被修改update/删除delete,同时事务A在执行期间没有更新/删除这些记录行的需求。
二、写锁(排他锁/Exclusive Locks,X锁)。
1、select * from table_name where ... for update。(事务A)
(1)这种方式是获取指定记录行的写锁,那么这些记录行就不能被其他事务获取读锁和排他写锁。如果事务A需要对这些记录行进行更新/删除操作。
三、