首页 > 其他分享 >RR 死锁一侧

RR 死锁一侧

时间:2023-08-01 09:36:23浏览次数:36  
标签:一侧 RR 获取 LOCK 索引 死锁 t8 lock id

CREATE TABLE `t8` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `d_id` varchar(40) NOT NULL DEFAULT '',
  `b_id` varchar(40) NOT NULL DEFAULT '',
  `is_dropped` tinyint(1) NOT NULL DEFAULT '0',
  `u_c` varchar(10) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `DealerAndBrokerAndDropped` (`d_id`,`b_id`,`is_dropped`)
) ENGINE=InnoDB ;

insert into t8 values(1,1,1,0,'a');
insert into t8 values(2,2,2,0,'a');
insert into t8 values(3,3,3,0,'a');
insert into t8 values(4,4,4,0,'a');

 

执行语句如下:

S1S2
begin  
select u_c from t8 where d_id='1' and b_id='1' and is_dropped=0 for update;  
  select u_c from t8 where d_id='1' and b_id='1' and is_dropped=0 for update; 处于堵塞状态
update t8 set u_c='b' where d_id='1' and b_id='1'; —此时触发死锁 S2回滚

 

仔细分析我们会发现trx id 5679最后被堵塞需要获取的锁为(lock_mode X waiting),堵塞发生在索引DealerAndBrokerAndDropped 上,也就是这是一个next key lock 且需要获取的模式为LOCK_X,处于等待状态。而我们来看trx id 5679前面获取的锁是什么呢?显然可以看到为(lock_mode X locks rec but not gap),获取发生在索引DealerAndBrokerAndDropped 上,也就是这是一个key lock且获取模式为LOCK_X。但是我们需要知道DealerAndBrokerAndDropped明明是一个唯一索引,获取key lock我们很容易理解,但是为什么也会出现获取next key lock呢?这个问题我们先放一下,先来分析一下整个死锁的产生的过程S1(select操作)
通过唯一性索引定位索引数据获取了唯一索引DealerAndBrokerAndDropped 上的
LOCK_REC_NOT_GAP|LOCK_X,获取成功记录就是 d_id='1' b_id='1' is_dropped=0这条数据。S1(select操作)
回表获取全部数据,这个时候需要主键上的相应的行锁。LOCK_REC_NOT_GAP|LOCK_X获取成功S2(select操作)
通过唯一性索引定位索引数据试图获取了唯一索引DealerAndBrokerAndDropped 上的
LOCK_REC_NOT_GAP|LOCK_X,获取失败记录就是 d_id='1' b_id='1' is_dropped=0这条数据,处于等待状态。S1(update操作)
通过索引DealerAndBrokerAndDropped 查找数据(注意这里已经不是唯一性定位操作了,下面会做分析),这个时候首先需要通过查询条件获取出需要更新的第一条数据,实际上这个时候也是d_id='1' b_id='1' is_dropped=0这条数据,需要获取的锁为LOCK_ORDINARY[next_key_lock]|LOCK_X,这个时候我发现虽然S1之前获取了这条数据的锁,但是锁模式变化了(一致不会重新获取,下面会分析这种行为),因此这里需要重新获取,但是这显然是不行的,因为S2都还处于等待中,因此这里也发生了等待。因此通过这个过程就出现死锁,S2等S1 S1等S2。

 

这是本死锁的一个最重要原因,知道了这个原因这个案例就理解了。首先我们先看这个update语句:

update t8 set u_c='b' where d_id='1' and b_id='1';

我们发现这个时候唯一索引还少一个条件也就是is_dropped字段,这个时候本次定位查询不会判定为唯一性查询,而是普通的二级索引定位方式,这个时候RR模式出现LOCK_ORDINARY[next_key_lock]就显得很自然了,下面是这个判断过程,代码位于row_search_mvcc中。

稍微解释一下,唯一性查找条件至少包含如下3点:

  • 1. 索引具有唯一性

  • 2. 查询的字段数量和索引唯一性字段数量相同

  • 3. 是主键或者查询条件中不包含NULL值

注意第3点源码说明如下:

 

满足上面4点条件才能确认为唯一查找,本查询由于第3条不满足因此,因此判定失败。
不仅如此如果本条数据加锁成功,那么你会看到如下的结果:      ;;

我们发现DealerAndBrokerAndDropped唯一索引的下一条记录也加了gap lock,这完全是RR模式非唯一索引的加锁行为。

标签:一侧,RR,获取,LOCK,索引,死锁,t8,lock,id
From: https://www.cnblogs.com/lovezhr/p/17595598.html

相关文章

  • android中使用startActivityForRes…
    网上找的一个通俗易懂,放在这以后好查阅假设:我这里有两个Activity:A和B,从A中向B中传递数据的时候采用的是Bundle封装数据,然后从A中跳转到B中,当B有需求将数据封装起来回传给A并跳转回A。那么A中接收数据时还要先判断Bundle是否为空,因为第一次访问A的时候(即B还没有回传的时候),Bundle......
  • error while loading shared libraries: libxml2.so.2: cannot open shared object fi
    参考:https://blog.csdn.net/qq_39779233/article/details/128215517  ============================================   errorwhileloadingsharedlibraries:libxml2.so.2:cannotopensharedobjectfile解决方法  解决方法:sudoapt-getinstalllibxml......
  • centos7中 configure: error: zlib development files not found
     01、系统[liujiaxin01@PC1~]$cat/etc/redhat-release##centos7.6发行版CentOSLinuxrelease7.6.1810(Core) 002、问题[[email protected]]$./configure##出现如下报错 003、解决方法[root@PC1~]#yum-yinstallzlibzlib......
  • UVM:5.1.6 build 阶段出现UVM_ERROR停止仿真
    1.在build_phase使用uvm_error,也会退出:2.结果:3.在end_of_elaboration_phase之前的phase中,如果出现UVM_ERROR,UVM就认为出现了致命错误,会调用uvm_fatal结束仿真。4.小设计看不出优势,大设计有用。......
  • VRRP优先级的取值范围
    (1)VRRP优先级的取值范围为0到255(数值越大表明优先级越高),可配置的范围是1到254(2)优先级0为系统保留给路由器主动放弃Master位置时候使用(3)255则是系统保留给IP地址拥有者使用。(4)若VRRP路由器的IP地址和虚拟路由器的接口IP地址相同,则该VRRP路由器被称为该IP地址的所有者;IP地址所有者自动......
  • 快速上手StarRocks
    StarRocks简介StarRocks(前身为Doris)是新一代极速全场景MPP数据库StarRocks高效支持实时数据分析用户可使用StarRocks构建大宽表、星型模型、雪花模型等多种模型快速上手,兼容MySQLProtocol,对现有研发人员非常友好注:MPP数据库:MassivelyParallelProcessing大规模并行处理......
  • elementUI 日期控件报错 TypeError: dateObject.getTime is not a function
    <el-form-itemlabel="日期"prop="date"><el-time-pickerv-model="form.date"type="date"placeholder="选择时间"style="width:100%;"></el-time-picker></el-form-item>date:[......
  • mongodb saslStart error
    MongoDBSASLStartErrorIntroductionWhenworkingwithMongoDB,youmayencounteranerrormessagestating"mongodbsaslStarterror."ThiserroroccurswhenthereisanissuewiththeSASL(SimpleAuthenticationandSecurityLayer)authenticati......
  • python valueerror too many values to unpack
    解决"PythonValueError:toomanyvaluestounpack"错误简介在Python编程中,有时候我们会遇到"ValueError:toomanyvaluestounpack"的错误。这个错误通常发生在尝试将一个可迭代对象(如列表、元组或集合)的元素分配给多个变量时。本文将帮助刚入行的开发者解决这个错误,并提供......
  • reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IndexOutOfBoundsE
    生产环境好好的,突然前端请求全部跨域,请求500。gateway报错。reactor.core.Exceptions$ErrorCallbackNotImplemented:java.lang.IndexOutOfBoundsException:Index:0,Size:0。所有的接口都报。原因由于gateway也集成了springboot-admin,开启了应用程序的actuator端点,导致......