标签:11 10 事务 发生 死锁 user MySQL id
SHOW ENGINE INNODB STATUS;来查看死锁日志:
SHOW PROCESSLIST;查看进程
MySQL的InnoDB引擎事务有4种隔离级别,主要是为了保证数据的一致性。
InnoDB引擎提供了行级锁,表锁。MyISAM提供了表锁,如题,MySQL会发生死锁吗?
答
会,在InnoDB引擎下,RR(REPEATABLE-READ)级别,如果多个事务争抢同一个资源,会发生死锁。在RR级别下,MySQL提供了next-key lock。假如一个索引的行有10,11,13,20
那么可能的next-key lock的包括:
(无穷小, 10]
(10,11]
(11,13]
(13,20]
(20, 无穷大)
即:当你查询12时,如果数据未查到,那么将对(12,13]范围内的数据进行锁定。next-key lock的定义可以到官方具体查看,这里做个演示。
CREATE TABLE `user` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(200) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1111 DEFAULT CHARSET=utf8;
![](http://upload-images.jianshu.io/upload_images/426671-f9b1689716bdbf68.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/408/format/webp)
//查看隔离级别,
show variables like '%tx_isolation%';
// 设置隔离界别
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
// 不设置自动提交
SET autocommit = 0;
死锁演示
- 首先将隔离级别都设置为RR级别的,并且不让事务自动提交
- 根据上面的数据,在事务1中查询
// 得到空结果集,此时锁定的范围是(33,100]
select * FROM user where id=33 for update;
- 在事务2中也进行查询
// 查询到空的结果,在事务2中锁定的范围是(34,100]
select * FROM user where id=34 for update
- 在事务1中插入数据
// 虽然事务1锁定了范围,事务2也锁定了范围
insert into user values(35,'ac',10);
![](http://upload-images.jianshu.io/upload_images/426671-e93b94c8d1b4c073.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp)
- 在事务2中也插入数据
insert into user values(34,'ac',10)
![](http://upload-images.jianshu.io/upload_images/426671-257a5ff7d0ac3be2.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/934/format/webp)
- 可以发现已经发生了死锁
解决办法
- 设置死锁的超时时长
innodb_lock_wait_timeout=500
- 查询到当前正在锁定的事务线程,将其杀死
// 可以看到正在运行的事务线程,还有运行状态
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
//trx_mysql_thread_id为上一条命令获取的结果,将具体的数字替换一下即可。
kill trx_mysql_thread_id
标签:11,10,事务,发生,死锁,user,MySQL,id 来源: https://www.cnblogs.com/cheyunhua/p/10483050.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。