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 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)