MYSQL 意向锁

锁的粒度

表锁(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

###参考文献

  1. http://book.51cto.com/art/200803/68127.htm
  2. http://blog.csdn.net/huyangyamin/article/details/46853321

转载于:https://my.oschina.net/arvinzhao/blog/1617797

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值