问题8:数据库innodb锁和阻塞信息查看

关系数据库是并发系统,满足ACID要求,锁是实现该特性的一项技术。锁的类型有共享锁和排它锁。共享锁是相互不阻塞,在同一个时间可以并发,例如select读操作。排它锁会相互阻塞写操作,理论上不阻塞读操作。当一个表的阻塞语句达到非常高的数量级也会导致无法读的操作,因为表的句柄打开数量也是有限的。
Innodb的锁是通过加载在索引上实现。若是一个表没有索引,innodb默认锁粒度从行级升为表级。并发性能大大降低。因此,大家在创建表的时候必须要指定主键,最好是整型类型。
下面给出innodb获取锁和事务冲突的具体语句:
从mysql性能字典表,innodb_lock_waits 是锁信息,innodb_trx是事务信息,有两条记录,需要放到一行中,因此,需要关联2次。
下面是列出阻塞和被阻塞的线程内容,线程4是先启动的事务,进行删除一条记录,不进行commit和rollback。然后线程5是后面启动,修改同一条记录。因此,线程4是阻塞线程,线程5是被阻塞线程。
select b.trx_mysql_thread_id as ‘被阻塞线程’,
b.trx_query as ‘被阻塞SQL’,
b.trx_mysql_thread_id as ‘阻塞线程’,
b.trx_query as ‘阻塞SQL’,
(UNIX_TIMESTAMP() - UNIX_TIMESTAMP(b.trx_started)) as ‘阻塞时间’
from
information_schema.innodb_lock_waits a
join information_schema.innodb_trx b
on a.requesting_trx_id=b.trx_id
join information_schema.innodb_trx c
on a.blocking_trx_id=c.trx_id
where (UNIX_TIMESTAMP() - UNIX_TIMESTAMP(c.trx_started))>10;
+—————–+——————–+————–+———–+————–+
| 被阻塞线程 | 被阻塞SQL | 阻塞线程 | 阻塞SQL | 阻塞时间 |
+—————–+——————–+————–+———–+————–+
| 5 | update t1 set id=2 | 4 | NULL | 25 |
+—————–+——————–+————–+———–+————–+

查看线程相互阻塞的方法:
show engine innodb status \G 查看详细事务内容
SELECT b.,a. FROM information_schema.INNODB_TRX a,information_schema.PROCESSLIST b WHERE a.trx_mysql_thread_id=b.ID AND a.trx_state=’RUNNING’ ;
线程id是4的是最先启动线程,显示出来的结果也是对的,因为4阻塞了5。线程5是后面启动事务。
锁内容,是经常遇到。若是觉得db有锁冲突,在极短时间内通过查询性能报表来获取阻塞和被阻塞信息。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值