有两个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 的事务提交之后锁才会释放,锁是独占操作,时间太长影响并发操作了。