美文网首页PHP干货分享
记一次线上锁等待超时事件

记一次线上锁等待超时事件

作者: JUNE言JUNE语 | 来源:发表于2018-09-12 19:23 被阅读21次

事件起因

在某次跨库操作中,存在两张表,在不同的数据库中,A.a跟B.b,其中A.a的ID是B.b的外键AID,存在强关联。

跨库事务的实现(事实上这种实现是存在漏洞的,暂时不讨论)

目前的跨库事务操作,为了保证数据的一致性,会同时开启多个数据库的事务,当事务完成时,会同时提交所有的事务,若失败会回滚所有的事务(问题就是,若A库的事务提交成功,B库的事务提交失败,就存在数据不一致)

本次会出现锁等待超时,跟这种事务的开启方式有关,但不是主要原因。

实际上的数据逻辑

开启事务(同时开启两个库的事务)

先在a表中插入一条新的记录,记为a1,ID=1,接着在b表中更新id=*的数据的字段AID值为1。这个时候更新操作就会被阻塞,一直到超时。

原因

外键是一种强关联,操作时需要确保对应的关联记录是存在的,而a表的数据插入后事务还未提交,此时对应的记录会被锁住,因此在b表中会一直出去等待a1锁被释放,而释放改锁只有事务提交,而统一的事务提交需要b表的数据更新完成,就会造成一个死循环。最终会在b的更新操作处报锁等待超时

相关文章

  • 记一次线上锁等待超时事件

    事件起因 在某次跨库操作中,存在两张表,在不同的数据库中,A.a跟B.b,其中A.a的ID是B.b的外键AID,存...

  • Web自动化的3种等待方式及常用定位方法

    Web自动化的3种等待方式 显式等待设定一个预期的超时时间,等待某个事件的发生,如果超时,则等待失败,抛出异常。显...

  • TCP Retransmission 连接超时

    记一次TCP 连接超时 背景 用户反馈 >> 有出现支付超时、页面问题 (部分情况会出现) 分析 检查最近是否...

  • Synchronized关键字简单解析

    synchronized是以排队的方式进行处理多线程访问的,调用前先判断有没有上锁,如果上锁则会等待,在等待过程...

  • JUC并发编程

    知识点: 线程生命周期(新建、运行、阻塞、等待(一直等待)、超时等待(超时取消等待)、终止); Synchroni...

  • Linux - 网络IO

    IO事件 标准输入文件描述符可以读 已连接套接字准备好可以写 如果一个IO事件等待超过10秒,发生超时 阻塞 我们...

  • Request 超时与文件上传

    1.超时 超时-timeout:超过等待时间,抛出异常(appium、selenium) 代码: base_url...

  • 等待将未来上锁

    2009-07-27 18:13:13| 诗灵*沁芳 羽毛飘在空中。 等待, 就是让连一片羽毛落地的时间, 都无限...

  • 超时节点在流程中的应用

    超时节点可以让流程在此处暂停超时指定的时间,在这个时间内,流程如果没有收到任何感兴趣的事件,那么就会产生超时事件结...

  • 并发实战(1)- 模拟等待超时模式的连接池

    @[TOC](并发实战(1)- 模拟等待超时模式的连接池) 前言 我们来进行并发的实战,用等待超时模式来实现连接池...

网友评论

    本文标题:记一次线上锁等待超时事件

    本文链接:https://www.haomeiwen.com/subject/ugebgftx.html