FOR UPDATE
概括:保证当前transaction执行结束前,没有其他transaction用当前行(delete, update 等),就用这个锁。一般用法:select for update
一个transaction中可以持有多个、相同行的conflicting locks,包括sub-transaction。
两个transaction不可以持有多个、相同行的conflicting locks。
Row-level locks 不影响data access,只影响concurrent transaction 中, 对相同行的写和锁获取。
Transaction 结束了row-level locks 就会被释放;或者rollback到savepoint,row-level locks 刚好在他们之间,也会被释放。
工作机制
FOR UPDATE, select.. for update 给rows加上了FOR UPDATE row-level lock。这样,其他transaction就不能对这些rows 修改,删除和获取lock。
在一个transaction中, select.. for update 给rows加上了FOR UPDATE row-level lock。这时,在其他transactions中做UPDATE, DELETE, SELECT FOR UPDATE, SELECT FOR NO KEY UPDATE, SELECT FOR SHARE, SELECT FOR KEY SHARE 会被阻塞,直到第一个transaction结束。
Transaction isolation 和row-level lock
如果transaction isolation level 是 repeatable read 和 serializable,在获取row-level lock 后, 数据有变动,就会抛出error。
Delete操作会获取 FOR UPDATE row-level lock;update的操作如果有unique index column,也会去获取FOR UPDATE row-level lock
FOR NO KEY UPDATE
概括:update语句没有更新unique key,会自动获取这个锁。这个锁可以和 select for key share 共存
Update 操作不是获取FOR UPDATE row-level lock 就是获取FOR NO KEY UPDATE row-level lock。
FOR NO KEY UPDATE row-level lock不和 FOR KEY SHARE LOCK 冲突
FOR SHARE
概括:select 查出的字段中,包含了非unique key,会自动获取这个锁
FOR SHARE row-level lock需要shared lock
会阻塞 UPDATE, DELETE, SELECT FOR UPDATE, SELECT FOR NO KEY UPDATE
不会影响SELECT FOR SHARE, SELECT FOR KEY SHARE
FOR KEY SHARE
概括:select 查出的字段中,只包含了unique key,会自动获取这个锁
关注row中的unique key。当前transaction获取 FOR KEY SHARE后,其他transaction若执行delete, update unique key column,select for update,select for no key update会被阻塞。
互斥和共存关系
FOR KEY SHARE | FOR SHARE | FOR NO KEY UPDATE | FOR UPDATE | |
FOR KEY SHARE | × | |||
FOR SHARE | × | × | ||
FOR NO KEY UPDATE | × | × | × | |
FOR UPDATE | × | × | × | × |