分布式事务锁特殊情况强制处理方法
分布式事务锁是指如果一个分布式事务没有正常结束,持有的锁便一直没有释放,导致在访问这个事务涉及的资源时,无法获取锁资源,从而报错。出现这种情况一般是由于分布式事务造成的,失败的原因可能是库之间的网络突然中断或者更新操作窗口会话被断开,导致两个库中的事务信息不一致,从而有残余的分布式事务信息未被释放。

特殊情况强制处理方法
分布式事务锁的一般性解决方案是直接进行回滚,或等待网络自动连接后数据库自动调配解决。特殊情况下当强制回滚无法相应时,还有两个备用操作可以解决——重启数据库与修改数据库基表数据。但修改基表的风险是比较大的,慎用!
重启数据库自动解决的风险在于,如果业务无法自动转移到另一个集群节点上,会对业务运行造成影响,进而对其他与之关联的数据库业务也造成影响。更进一步的,会导致风险扩散。因此,建议使用其他备用操作,比如修改数据库基表数据。
修改数据库基表是指,对数据库基表pending_trans$和pending_sessions$录入分布式事务的相关数据,提交数据后对该事务也进行提交,伪造该分布式事务已经完成的记录,从而使得该锁能够成功释放。然而,官方一般不建议修改数据库基表信息,因为基表属于Oracle后端表,修改基表相当于数据欺骗,可能导致数据不一致,数据混乱,或者基表数据异常进而影响其他事务执行。
如果需要修改数据库基表,可以手动录入事务数据,提交数据后对该事务进行强制commit,伪造成该事务已完成的记录。然而,由于该事务的执行记录是伪造的,还需清除本地数据库所记录的远程事务入口。清除该条伪造的事务数据记录后,分布式事务锁便可正常解开,对表进行操作。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6581.html
