问题描述
①BaseServices 中有两个方法 updateName(),updateFlag()# DaoServices 中有个方法updateFlag()②UserServices 中有个方法,methodUserServices()[注解:Propagation.REQUIRES_NEW],调用如下methodUserServices(){ try{ updateName(); }catch(){ updateFlag(); }}两个方法操作的是同表、同记录,会导致一个问题,如果updateName出现异常.程序运行到updateFlag()这里没有重新开启事务,会导致一起回滚掉,如果把updateFlag单独提取出来也就是放到DaoServices里面,注解同样为Propagation.REQUIRES_NEW,会出现 Lock wait timeout exceeded; try restarting transaction; 异常想要达到的效果即使updateName出现异常,updateFlag这个方法要提交事务
解决方案
这个没法实现,事务死锁了。updateName()的事务(简称A),获得了那条记录的排它锁,updateName()的事务(简称B)又去请求这条记录的排它锁,事务B会一直阻塞到事务A释放锁,而事务A要释放锁必须要等待事务B完成(因为事务B是嵌套在事务A中的)。
解决方案二:
你把这两个方法放在两个事物里面不就行了
时间: 2024-07-28 16:17:43