锁的粒度
表锁(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锁.
表锁的兼容性矩阵
事务及锁问题排查
information_schema数据库包含三张表(各字段含义后续补充): innodb_trx(事务详情表):当前允许系统开启事务,不包括只读事务。 innodb_locks(锁详情表):当前系统事务锁请求或占用情况。 innodb_lock_waits(阻塞事务表):事务间锁等待情况。
查询事务阻塞信息:
select
r.trx_id waiting_trx_id,r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query,
b.trx_id blocking_trx_id,r.trx_mysql_thread_id blocking_thread, r.trx_query blocking_query
from information_schema.innodb_lock_waits w
inner join information_schema.innodb_trx b on b.trx_id=w.blocking_trx_id
inner join information_schema.innodb_trx r on r.trx_id=w.requesting_trx_id
###参考文献