sootv5 2014-08-07 16:31
浏览 223
已采纳

spring的声明式事务问题

①BaseServices 中有两个方法 updateName(),updateFlag()

DaoServices 中有个方法updateFlag()

②UserServices 中有个方法,methodUserServices()[注解:Propagation.REQUIRES_NEW],
调用如下
[code="java"]
methodUserServices(){
try{
updateName();
}catch(){
updateFlag();
}
}
[/code]
两个方法操作的是同表、同记录,会导致一个问题,如果updateName出现异常.程序运行到updateFlag()这里没有重新开启事务,会导致一起回滚掉,
如果把updateFlag单独提取出来也就是放到DaoServices里面,注解同样为Propagation.REQUIRES_NEW,会出现 Lock wait timeout exceeded; try restarting transaction; 异常
想要达到的效果即使updateName出现异常,updateFlag这个方法要提交事务

  • 写回答

2条回答 默认 最新

  • maltab5y5 2014-08-07 20:51
    关注

    这个没法实现,事务死锁了。updateName()的事务(简称A),获得了那条记录的排它锁,updateName()的事务(简称B)又去请求这条记录的排它锁,事务B会一直阻塞到事务A释放锁,而事务A要释放锁必须要等待事务B完成(因为事务B是嵌套在事务A中的)。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站