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个回答

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

PROPAGATION_REQUIRED就好了呀,两者同一个事务

明白了,你的核心问题是“减少持锁时间”这个似乎做不到。
methodB就是需要执行很长时间,怎么可能在没有锁的情况下执行,又有事务的支持呢?再说了,锁占用时间长也没太大关系啊。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问