表的共享、独占锁:
共享锁:
类似于 JUC 下的 ReentrantReadWriteLock 下的 读锁。多个事务可以同时为数据加锁,同时访问到数据。
独占锁:
类似于 JUC 下的 ReentrantReadWriteLock 下的 写锁。同一时间,只能有一个事务获取为数据加锁。
只能有一个事务访问到数据
不同存储引擎的锁:
默认情况下:在对某个表执行SELECT、INSERT、DELETE、UPDATE语句时
(1): InnoDB 是不会为这个表添加表级别的 S锁 或者 X锁 的, Innodb 添加的锁一般都是行级别的锁
(2):MyISAM 添加的锁一定是表级别的锁,MyISAM 不支持行级别的锁
注:我们可以通过使用以下命令为 Innodb 加上表级别的锁
LOCK TABLES t READ :对表 t 加表级别的 共享锁
LOCK TABLES t WRITE :对表 t 加表级别的 独占锁
MyISAM 引擎也要通过 以上命令手动加锁,在访问数据时,MyISAM默认不加锁
意向锁:
问题:
当我们想对 Innodb 存储引擎添加表级别的独占锁时,我们需要判断,该表中不能存在任何锁。
我们如何判断在表中是否存在行级别的锁呢?
方案一:遍历表中的数据,一个个记录的判断是否有行级锁(该方案效率太低)
方案二:使用意向锁
产生场景:
出现当我们添加行级锁时,Innodb 存储引擎会自动的给这个表添加一个表级别的意向锁
表示该表中存在行级锁。
如果行级锁是共享锁,意向锁也是共享的。行级锁是独占的,意向锁也是独占的
兼容特性:
|
意向共享锁
|
意向独占锁
|
普通表级共享锁
|
普通表级独占锁
|
意向共享锁
|
兼容
|
兼容
|
兼容
|
不兼容
|
意向独占锁
|
兼容
|
兼容
|
不兼容
|
不兼容
|
解释:
当我们对表中的 行记录 A 添加独占锁 A时,Innodb 会自动给该表添加一个意向独占锁 A
当我们对表中的 行记录 B 添加独占锁 B时,Innodb 会自动给该表添加一个意向独占锁 B
因为是对不同的行记录添加独占锁,所以可以两个行记录锁都会添加成功,
也就说明同时会给表添加两个意向独占锁,所以,意向独占锁可共存
元数据锁:
Innodb 默认是锁是行级锁,但那是对表中数据进行 Insert Delete Update Select 操作时
如果我们要是对整个表的表结构进行变化时,那么我们会为该表添加一个表级锁,就是元数据锁