MYSQL-GAP&插入意向锁 死锁记录

Posted 皓月行空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL-GAP&插入意向锁 死锁记录相关的知识,希望对你有一定的参考价值。

1、建表:

CREATE TABLE `test_dead_lock` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `user_id` bigint(20) unsigned NOT NULL COMMENT 用户id',
  `user_name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名',
`type` int(10) DEFAULT '0' COMMENT '类型',
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_idx` (`user_id`,`user_name`),
  KEY `idx_name` (`user_name`)

) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COMMENT='测试死锁表';

mysql 5.7,事务隔离级别RR,会话自动提交事务关闭【set autocommit=off;】

2、数据准备

INSERT INTO `test_dead_lock` (`id`, `user_id`, `user_name`, `type`)
VALUES
	(1,1,'name22',0),
	(2,2,'name22',0),
	(3,3,'name3',0),
	(4,4,'name22',0),
	(9,8,'name8',0),
	(12,10,'name10',0),
	(41,10,'name100',0),
	(64,11,'name11A',0),
	(65,12,'name12A',0);

3、事务处理

事务1事务2备  注
start transaction;
start transaction;

delete from test_dead_lock

where user_id=5 ;

不存在数据,加间隙锁

delete from test_dead_lock

where user_id=6 ;

不存在数据,加间隙锁

insert ignore into test_dead_lock

(user_id,user_name)
values

(5,'name5A'),(5,'name5AA');

加插入意向锁,等待2事务间隙锁释放

insert ignore into test_dead_lock

(user_id,user_name)
values

(6,'name6A'),(6,'name6AA');

加插入意向锁,等待1事务间隙锁释放

死锁

rollback;rollback;

备注:也可以直接 delete 13,14,插入13,14数据来验证,间隙锁范围是正无穷。

4、死锁日志

show engine innodb status;

5、涉及知识点:

 (1)mysql 事务隔离级别

(2)mysql 锁

以上是关于MYSQL-GAP&插入意向锁 死锁记录的主要内容,如果未能解决你的问题,请参考以下文章

Mysql 死锁过程及案例详解之插入意向锁与自增锁备份锁日志锁Insert Intention Lock Auto-increment Lock Backup Lock Log Lock

行锁及其算法死锁意向锁

行锁及其算法死锁意向锁

MySQL锁

select for update 并发insert死锁问题

什么是MySQL插入意向锁?