class MyService {
public void a() {
synchronized(somekey) {
b();
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void b() {
...do DB works...
}
}
我的目标是
当我从外部调用()方法时,事务不起作用。
有什么建议吗?
感谢。
答案 0 :(得分:4)
除非你使用代码编织,否则这不起作用。
Spring处理事务的默认方式是AOP proxies。对事务方法的调用如下:
caller --> ProxyClass.a() --> YourClass.a()
如果在同一个对象上调用另一个方法,则不会通过代理,因此没有事务行为。
caller --> ProxyClass.a() --> YourClass.a() --> YourClass.b()
如果您不想使用AspectJ,可以使用AopContext.currentProxy()
获取代理对象。
答案 1 :(得分:1)
不是100%肯定。我认为所有@Transactional调用必须在事务开始的同一个线程上完成。我肯定知道 @Transactional不能跨线程。 (我想通过设计)
答案 2 :(得分:0)
我很好奇钥匙的性质。为什么服务会产生它?不会有替代设计将其放入数据库吗?
如果没有错误信息,很难确切地说出错误。
答案 3 :(得分:0)
如果您想在b()
内拨打a()
,并且想要进行b()
交易,则必须将其放入单独的课程中。
答案 4 :(得分:0)
对b()的方法调用是内部调用,而非Henning所说的事务代理。
this博文中解释了整件事。