MySQL对更新死锁的强事务处理
在很多强事务场景中,我们经常会在更新上使用显式锁定来保证数据的一致性。不过网上发现,有一种场景肯定会出现死锁,如下简述: CREATE TABLE `dbcache` (`id` int(10) unsigned NOT NULL AUTO_INCRMENT,
`skey` varchar( 32 ) NOT NULL,
`value1` varchar(100) NOT NULL .测试执行的流程) 第一步:session 1,对于 update 是打开的,它是一个锁,但是 id=4 没有数据,并且此时,间隙闭合已实现; 第二步:会话2,锁打开更新,id=4,无数据。此时还需要实现间隙闭合。按照惯例,必须等到第一步中的间隙锁释放后才可以加锁。但是,mysql目前允许会话锁定2。你获得了一个间隙锁,这意味着两个间隙锁的x个锁实际上是兼容的; 第三步:等待会话2释放间隙锁; 第四步:等待会话1释放间隙锁,则完美死锁按照上述步骤100%重现死锁问题,包括所有mysql版本。我咨询了官方同学,说innodb就是这样设计的,暂时无法解决这个问题; 大家肯定会问,因为茂县需要更新一个不存在的值。其实真实的场景是:如果id存在,就更新它,如果不存在,就写入它。但在并发场景下,会触发X-lock兼容性问题,目前尚无解决方案。 ;所以每个人都需要在真实的商业项目中进行测试和测试,否则结果可能会破坏他们所知道的一些知识;由于我们店的访问量不大,所以我们直接将listing改为替换,绕过了这个问题;
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。