ganqing1234 2008-12-08 16:33
浏览 533
已采纳

spring 嵌套事务 的 加锁 问题

有两个service:ServiceA 和 ServiceB
[code="java"]
ServiceA {
methodA() {
methodB();
// do many other things
...
}
}

ServiceB {
methodB() {
...
}
}
[/code]

现在的 问题是 如果 ServiceB 的 methodB 持有锁(比如 LockMode.UPGRADE),而 ServiceA 中的methodA 在调用 methodB后还要处理很多事情,如果它们在一个事务里就会导致methodB 持有锁过长时间。如果把methodB的传播行为设为PROPAGATION_REQUIRES_NEW的话,如果methodA失败rollback,methodB不会rollback,会产生脏数据。设为PROPAGATION_REQUIRES_NESTED因为是嵌套事务,应该也不会释放锁。

不知道有什么 好的方法可以减少 持锁时间,又可以保证methodA rollback 时,methodB也 rollback 。

先谢过!
[b]问题补充:[/b]
to joachimz "PROPAGATION_REQUIRED就好了呀,两者同一个事务"

那样的话锁在外部事务结束时才会释放,没有解决我的问题啊。
[b]问题补充:[/b]
to joachimz 谢谢你的回复。
“methodB就是需要执行很长时间,怎么可能在没有锁的情况下执行,又有事务的支持呢?” methodB 持有锁,但是它执行的很短,调用它的methodA 会执行很多其他的事情,这样如果它们在一个事务里,methodA 的事务提交之后锁才会释放,锁是独占操作,时间太长影响并发操作了。

  • 写回答

3条回答

  • iteye_10167 2008-12-09 23:09
    关注

    能想办法调整设计,最后再调用B吗?
    而且一般情况下,都是行级锁,存在冲突的几率不大。

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

报告相同问题?

悬赏问题

  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建