Alt*_*tug 2 java concurrency spring synchronization transactions
class MyService {
public void a() {
synchronized(somekey) {
b();
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void b() {
...do DB works...
}
}
Run Code Online (Sandbox Code Playgroud)
我的目标是
当我从外部调用 a() 方法时,事务不起作用。
有什么建议 ?
谢谢。
除非您使用代码编织,否则这是行不通的。
Spring 处理事务的默认方式是通过AOP 代理。对事务方法的调用是这样的:
caller --> ProxyClass.a() --> YourClass.a()
Run Code Online (Sandbox Code Playgroud)
如果你在同一个对象上调用另一个方法,你不会通过代理,所以没有事务行为。
caller --> ProxyClass.a() --> YourClass.a() --> YourClass.b()
Run Code Online (Sandbox Code Playgroud)
如果不想使用 AspectJ,可以使用AopContext.currentProxy()
.