我在尝试将 @Transactional 注释应用于同一类 (MyService) 中的方法 (methodC()) 时遇到了此问题。尽管使用了注释,但交易似乎并未按预期创建。
@Service
public class MyService {
@Autowired
private Service1 service1;
@Autowired
private Service2 service2;
@Override
public void methodA() {
methodB();
}
private void methodB() {
try{
methodC();
}catch(MyException e){
System.out.println(e);
}catch(Exception e){
System.out.println(e);
}
}
@Transactional
public void methodC() throws MyException, Exception{
try{
service1.someDeleteAndInserts();
service2.someDeleteAndInserts();
}catch(MyException e){
throw e;
}catch(Exception e){
throw e;
}
}
}
正如我现在所拥有的,它为每个方法单独创建一个事务。我希望它只为该方法中调用的所有方法进行一笔事务。
@Transactional
public void methodC() throws MyException, Exception{
try{
service1.someDeleteAndInserts();
service2.someDeleteAndInserts();
}catch(MyException e){
throw e;
}catch(Exception e){
throw e;
}
}
您不能在同一服务中调用带注释的方法
@Transactional
。您只能从服务外部调用它,否则不会创建任何事务。每个 Spring 服务都是一个代理,并且事务(AOP)是在代理上创建的,因此一旦您输入任何方法,您就不再在代理中,因此没有 AOP(无事务):
例如,如果您有:
@Service
public class Service1 {
@Transactional
public void method1() { ... }
public void method2() {
method1();
}
}
@Service
public class Service2 {
@Autowired
private Service1 service1;
public void method1() {
service1.method1();
}
public void method2() {
service1.method2();
}
}
service2.method2()
将不会创建交易。service2.method1()
将创建一个。因为 Spring 处理代理和 AOP 的方式。