diff --git a/java/spring/spring/事务/Transaction.md b/java/spring/spring/事务/Transaction.md new file mode 100644 index 0000000..88c117c --- /dev/null +++ b/java/spring/spring/事务/Transaction.md @@ -0,0 +1,52 @@ +# Spring事务失效 + + + +## 子调用失效 + +Test service 有f1\f2\f3三个方法; + +```java +@Service +public class Test { + + @Transaction + public void f1(){ + f2(); + f3(); + } + + @Transaction + public void f2(){} + + public void f3(){} +} +``` + +以上代码f1方法有添加声明式事务注解 `@Transaction `不管在f1 f2 f3那个方法中出现错误三个方法都会回滚; + +```java +@Service +public class Test { + + public void f1(){ + f2(); + f3(); + } + + @Transaction + public void f2(){} + + public void f3(){} +} +``` + +以上代码f1没有添加声明式事务注解 `@Transaction`则 在执行过程中出现错误f1方法不会进行回滚,f2\f3方法不管有没有添加声明式事务都不会进行回滚,也就是说f2方法的事务失效了,因为当f1没有添加`@Transaction`注解时获取的test 对象不是代理对象,调用本身方法也不会使用到代理对象,所以f1下调用自身带有声明式事务注解的方法都会失效; + +解决办法 + +1、对需要添加事务的代码块添加编程式事务 + +2、通过其他Service对要开启事务的方法进行调用 比如在Test2 service中 注入 Test 然后调用f2方法 + +3、自己注入自己,在Test 中注入Test ,然后再f1里面使用注入的Test调用f2方法 \ No newline at end of file