打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MySQL会发生死锁吗?

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;
 
image-20190304142624761
//查看隔离级别,show variables like '%tx_isolation%';// 设置隔离界别SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}// 不设置自动提交SET autocommit = 0;

死锁演示

  1. 首先将隔离级别都设置为RR级别的,并且不让事务自动提交

  2. 根据上面的数据,在事务1中查询

// 得到空结果集,此时锁定的范围是(33,100]select * FROM user where id=33 for update;
  1. 在事务2中也进行查询

// 查询到空的结果,在事务2中锁定的范围是(34,100]select * FROM user where id=34 for update
  1. 在事务1中插入数据

// 虽然事务1锁定了范围,事务2也锁定了范围insert into user values(35,'ac',10);
 
image-20190304143355381
  1. 在事务2中也插入数据

insert into user values(34,'ac',10)
 
image-20190304143707234
  1. 可以发现已经发生了死锁

解决办法

  1. 设置死锁的超时时长

innodb_lock_wait_timeout=500

  1. 查询到当前正在锁定的事务线程,将其杀死

// 可以看到正在运行的事务线程,还有运行状态SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;//trx_mysql_thread_id为上一条命令获取的结果,将具体的数字替换一下即可。kill trx_mysql_thread_id

 

来源:http://www.icode9.com/content-2-132051.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
MySQL锁:02.InnoDB锁
手把手教你分析Mysql死锁问题
为什么开发人员必须要了解数据库锁?
MySQL学习笔记(13):锁和事务
如何减少和处理死锁 - MySQL 8.0官方文档笔记(四)
Mysql之锁、事务绝版详解
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服