MYSQL 意向锁

2018-02-05 10:38:19来源:oschina作者:arvinzhao人点击

分享
锁的粒度

表锁(Table Lock):
对整个表加锁,影响表的所有记录。通常用在DDL语句中,如DELETE TABLE,ALTER TABLE等。


行锁(Row Lock):
对一行记录加锁,只影响一条记录。通常用在DML语句中,如INSERT, UPDATE, DELETE等。
综上,表锁影响整个表的数据,因此并发性不如行锁好。


意向锁(Intention Lock)

InnoDB存储引擎支持多粒度锁定,这种锁定允许事务在行级上的锁和表级上的锁同时存在,为了支持在不同粒度上进行加锁操作,innoDB引入了意向锁。下面举例说明意向锁的作用。


因为表锁覆盖了行锁的数据,所以表锁和行锁也会产生冲突。如:


trx1:
1. BEGIN;
2. 对表T1 加X锁,修改表结构。
trx2:
1. BEGIN;
2. 对表T1 的一行记录加S或X锁(事务被阻塞)。

因trx1锁住了整个表,所以trx2就不能再对T1的单条记录加X或S锁,去读取或修这条记录。为了方便检测表级锁和行级锁之间的冲突,就引入了意向锁。


意向锁分为意向读锁(IS)和意向写锁(IX)。
意向锁是表级锁,表示事务想要读或写某几行记录。
意向锁之间不会产生冲突,真正的冲突在加行锁时检查。
对行数据加S/X锁之前,需要首先给该表加IS/IX意向锁。

采用了意向锁后,上面的例子就变成了:


trx1:
1. BEGIN
2. trx1 给 T1 加X锁,修改表结构。
trx2:
1. BEGIN
2. trx2 给 T1 加IX锁(事务被阻塞,等待加锁成功)
3. trx2 给 T1 的一行记录加S或X锁.
表锁的兼容性矩阵

锁兼容性

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台