死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,可以认为如果一个资源被锁定,它总会在以后某个时间被释放。而死锁发生在当多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进程都无法继续下去。
InnoDB的并发写操作会触发死锁,InnoDB也提供了死锁检测机制,可以通过设置innodb_deadlock_detect参数可以打开或关闭死锁检测:
innodb_deadlock_detect=上,打开死锁检测,数据库发生死锁时自动回滚(默认选项)
innodb_deadlock_detect=关,关闭死锁检测,发生死锁的时候,用锁超时来处理,通过设置锁超时参数innodb_lock_wait_timeout可以在超时发生时回滚被阻塞的事务
还可以通过设置InnDB监视器来进一步观察锁冲突详细信息
设置InnoDB监控方法
建立测试库
mysql>创建数据库测试;
查询好了,1行影响(0.20秒)
mysql>使用测试
完成阅读表信息表和列的名称
你可以关掉这个功能一个更快的启动——
数据库修改
mysql>创建表innodb_monitor (INT)引擎=innodb;
查询好,0行影响(1.04秒)
mysql>创建表innodb_tablespace_monitor (INT)引擎=innodb;
查询好,0行影响(0.70秒)
mysql>创建表innodb_lock_monitor (INT)引擎=innodb;
查询好,0行影响(0.36秒)
mysql>创建表innodb_table_monitor (INT)引擎=innodb;
查询好,0行影响(0.08秒)
可以通过显示引擎innodb状态命令查看死锁信息
mysql>显示引擎innodb状态\ G
* * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * *
,类型:InnoDB
,名称:
状态:
=====================================
2018-05-10 09:17:10 0 x7f1fbc21a700 INNODB监视器输出
=====================================
每秒平均计算从过去46秒
- - - - - - - - - - - - - - - - - -
后台线程
- - - - - - - - - - - - - - - - - -
srv_master_thread循环:53 srv_active, 240099年0 srv_shutdown srv_idle
srv_master_thread日志刷新和写道:0
- - - - - - - - - - -
信号量
- - - - - - - - - - -
数组操作系统等信息:预订数2007
操作系统等信息数组:信号计数1987
RW-shared旋转3878、5594轮,操作系统等1735
91年RW-excl旋转3轮,操作系统等4
RW-sx旋转1,30轮,操作系统等待1
自旋轮每等:1.44 RW-shared, 30.33 RW-excl, 30.00 RW-sx
- - - - - - - - - - - -
交易
- - - - - - - - - - - -
Trx id计数器78405
清洗完成硫氧还蛋白的n: o & lt;78404年撤销n: o & lt;10个状态:运行但闲置
历史列表长度21
每个会话的事务列表:
——交易421249967052640,没有开始
0锁结构(s),堆大小1136,0行锁(s)
- - - - - - - - - -
文件I/O
- - - - - - - - - -
I/O的线程0状态:等待完成aio请求(插入缓冲线程)
I/O的线程1状态:等待完成aio请求(日志线程)
I/O的线程2状态:等待完成aio请求(读线程)
.............................................................................
.............................................................................
.............................................................................
InnoDB的并发写操作会触发死锁,InnoDB也提供了死锁检测机制,可以通过设置innodb_deadlock_detect参数可以打开或关闭死锁检测:
innodb_deadlock_detect=上,打开死锁检测,数据库发生死锁时自动回滚(默认选项)
innodb_deadlock_detect=关,关闭死锁检测,发生死锁的时候,用锁超时来处理,通过设置锁超时参数innodb_lock_wait_timeout可以在超时发生时回滚被阻塞的事务
还可以通过设置InnDB监视器来进一步观察锁冲突详细信息
设置InnoDB监控方法
建立测试库
mysql>创建数据库测试;
查询好了,1行影响(0.20秒)
mysql>使用测试
完成阅读表信息表和列的名称
你可以关掉这个功能一个更快的启动——
数据库修改
mysql>创建表innodb_monitor (INT)引擎=innodb;
查询好,0行影响(1.04秒)
mysql>创建表innodb_tablespace_monitor (INT)引擎=innodb;
查询好,0行影响(0.70秒)
mysql>创建表innodb_lock_monitor (INT)引擎=innodb;
查询好,0行影响(0.36秒)
mysql>创建表innodb_table_monitor (INT)引擎=innodb;
查询好,0行影响(0.08秒)
可以通过显示引擎innodb状态命令查看死锁信息
mysql>显示引擎innodb状态\ G
* * * * * * * * * * * * * * * * * * * * * * * * * * * 1。行* * * * * * * * * * * * * * * * * * * * * * * * * * *
,类型:InnoDB
,名称:
状态:
=====================================
2018-05-10 09:17:10 0 x7f1fbc21a700 INNODB监视器输出
=====================================
每秒平均计算从过去46秒
- - - - - - - - - - - - - - - - - -
后台线程
- - - - - - - - - - - - - - - - - -
srv_master_thread循环:53 srv_active, 240099年0 srv_shutdown srv_idle
srv_master_thread日志刷新和写道:0
- - - - - - - - - - -
信号量
- - - - - - - - - - -
数组操作系统等信息:预订数2007
操作系统等信息数组:信号计数1987
RW-shared旋转3878、5594轮,操作系统等1735
91年RW-excl旋转3轮,操作系统等4
RW-sx旋转1,30轮,操作系统等待1
自旋轮每等:1.44 RW-shared, 30.33 RW-excl, 30.00 RW-sx
- - - - - - - - - - - -
交易
- - - - - - - - - - - -
Trx id计数器78405
清洗完成硫氧还蛋白的n: o & lt;78404年撤销n: o & lt;10个状态:运行但闲置
历史列表长度21
每个会话的事务列表:
——交易421249967052640,没有开始
0锁结构(s),堆大小1136,0行锁(s)
- - - - - - - - - -
文件I/O
- - - - - - - - - -
I/O的线程0状态:等待完成aio请求(插入缓冲线程)
I/O的线程1状态:等待完成aio请求(日志线程)
I/O的线程2状态:等待完成aio请求(读线程)
.............................................................................
.............................................................................
.............................................................................