最近两日做公司电信某计费项目时,接收一个银行对账的任务,在完成对账后。电信和银行两方金额一致时需要进行充值、冲正操作保持金额一致。冲正服务是JAVA统一调用Tuxedo服务,这个服务已经是一个稳定可用的接口了,但是我在开发自测的时候每次调用都会在某一步操作卡住。而别人调用这个接口却没问题,仔细对照请求参数也发现不了问题。后来同事提醒,突然才意识到Tuxedo服务'卡住'可能是锁表了。前前后后一看代码,这才突然反应过来。错误代码如下

(BUG记录)记一次与其他系统交互协作时造成的锁表问题-LMLPHP

重点就是我在调用Tuxedo服务前先修改了本地的Serial表,而Tuxedo在冲正的过程中也修改了此表中的同一行记录,而此处已经开启了事务控制锁定了此记录。就造成了Java等待Tuxedo返回结果,Tuxedo等待Java释放行锁类似死锁性质的尴尬状态。解决方案其实很简单,就是把自己的更新操作放置在Tuxedo服务后面。

这次问题主要给了自己一个教训:如果有业务内部需要调用其他服务端接口时,在非必要下都应该将自己的修改操作放置在后面,在保持事务一致性的基础上还可以防止与对方服务操作形成死锁操作。

05-11 13:06