事件起因
在某次跨库操作中,存在两张表,在不同的数据库中,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的更新操作处报锁等待超时
网友评论