1.独占锁(防止脏写)
独占锁叫做写锁
并发事务修改一行数据时,会先判断这行数据是否有被加锁.
如果未加锁就会添加一个独占锁,包含了自己的trx_id和状态和这行数据关联起来
第二事务过来的时候判断到有锁了,那么他也加一个独占锁在后面排队只是状态是待执行的状态
第一个事务执行完了之后就会检查这行数据是否有其他的锁.他会修改一个锁的状态让他进入执行状态
2.共享锁
共享锁叫做读锁
去读取加了独占锁的值的时候,会自动执行mvcc的规则去undo中读他的快照版本
共享锁是查询的时候可以添加的锁,但共享锁和独占锁是互斥的.
加了独占锁的行是加不了共享锁的,但另一个查询的事务是可以加共享锁的
所以有以下规律
锁类型 独占锁 共享锁
独占锁 互斥 互斥
共享锁 互斥 不互斥
3.sql上加锁的使用方式
共享锁:在查询语句后面加上lock in share mode
独占锁:for update
4.表级的意向锁
表级独占意向锁 LOCK TABLES xxx WRITE
表级共享意向锁 LOCK TABLES xxx READ
表级的意向锁意义不大,可以不用考虑
锁类型 独占锁 意向独占锁 共享锁 意向共享锁
独占锁 互斥 互斥 互斥 互斥
意向独占锁 互斥 不互斥 互斥 不互斥
共享锁 互斥 互斥 不互斥 不互斥
意向共享锁 互斥 不互斥 不互斥 不互斥