RR 隔离级别下删除不存在数据导致 【死锁】

        如果删除索引的数据不存在,会出现一个间隙锁,区间(左边最近第一个值, 右边最近第一个值), 间隙锁之间是不会冲突的,只有往间隙中插入数据的操作,才会被阻塞。

重温间隙锁目的

间隙锁的目的是为了防止幻读,其主要通过两个方面实现:

(1)防止间隙内有新数据被插入

(2)防止已存在的数据,更新成间隙内的数据(例如防止numer=3的记录通过update变成number=5)

死锁场景流程复盘:开启事务,任务数据先执行批量删除操作,然后执行插入操作, 出现死锁。

数据表


CREATE TABLE `task` (
  `uid` int(11) NOT NULL,
  `task_id` int(11) NOT NULL,
  `state` int(11) DEFAULT NULL,
  `sub_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`uid`,`task_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='任务数据';
  1.  空表的情况下, 删除操作都可以,从提示看没有改动数据RR 隔离级别下删除不存在数据导致 【死锁】_第1张图片

   2.  开始分别插入一些数据, 左边阻塞了,然后我们看锁表的信息

RR 隔离级别下删除不存在数据导致 【死锁】_第2张图片

  3.  查看INNODB_LOCKS 表

RR 隔离级别下删除不存在数据导致 【死锁】_第3张图片

suprenum 表示超过索引中的最大值,也就是说 两个事务的间隙锁 范围都是  (-∞, +∞),左边 执行insert 的事务正在等待右边释放锁,这时候如果右边事务也执行insert 就死锁了……

你可能感兴趣的:(数据库,java,开发语言,死锁,RR)