MySQL的InnoDB引擎事务有4种隔离级别,主要是为了保证数据的一致性。mysql
InnoDB引擎提供了行级锁,表锁。MyISAM提供了表锁,如题,MySQL会发生死锁吗?sql
会,在InnoDB引擎下,RR(REPEATABLE-READ)级别,若是多个事务争抢同一个资源,会发生死锁。在RR级别下,MySQL提供了next-key lock。假如一个索引的行有10,11,13,20 那么可能的next-key lock的包括: (无穷小, 10] (10,11] (11,13] (13,20] (20, 无穷大)bash
即:当你查询12时,若是数据未查到,那么将对(12,13]范围内的数据进行锁定。next-key lock的定义能够到官方具体查看,这里作个演示。ui
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;
复制代码
//查看隔离级别,
show variables like '%tx_isolation%';
// 设置隔离界别
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
// 不设置自动提交
SET autocommit = 0;
复制代码
// 获得空结果集,此时锁定的范围是(33,100]
select * FROM user where id=33 for update;
复制代码
// 查询到空的结果,在事务2中锁定的范围是(34,100]
select * FROM user where id=34 for update
复制代码
// 虽然事务1锁定了范围,事务2也锁定了范围
insert into user values(35,'ac',10);
复制代码
insert into user values(34,'ac',10)
复制代码
innodb_lock_wait_timeout=500spa
// 能够看到正在运行的事务线程,还有运行状态
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
//trx_mysql_thread_id为上一条命令获取的结果,将具体的数字替换一下便可。
kill trx_mysql_thread_id
复制代码
就演示到这了线程