网上找了一下 spring 事务失效的原因,感觉这篇文章比较好
https://blog.csdn.net/andybbc/article/details/52913525
这边文章中有个点想请教一下大伙:
如果配置了事务, 就相当于又创建了一个类:UserServiceProxy
public class UserServiceProxy extends UserService{ private UserService userService; ... public User getUserByName(String name){ User user = null; try{ // 在这里开启事务 user = userService.getUserByName(name);=======A 处 // 在这里提交事务 } catch(Exception e){ // 在这里回滚事务
// 这块应该需要向外抛异常, 否则我们就无法获取异常信息了.
// 至于方法声明没有添加异常声明, 是因为覆写方法, 异常必须和父类声明的异常"兼容".
// 这块应该是利用的 java 虚拟机并不区分普通异常和运行时异常的特点.
throw e;
}
return user;
}
...
}
疑问点是:文章说所有的 private 方法, final 方法 和 static 方法 都无法 直接 添加 spring 的事务管理功能是因为于 java 继承时, 不能重写 private , final , static 修饰的方法.
可是在这边的 A 处不是可以放入 UserService 的由 private , final , static 修饰的方法吗?
谢谢大伙~
1
putaozhenhaochi 2020-04-17 20:19:34 +08:00 via Android
可以了解下 Java 动态代理
|
2
bobuick 2020-04-17 20:32:22 +08:00
你要是手动拿事务对象随便怎么都行。要是用 Spring 自己的事务注解,非 public 的方法都不行。它是基于动态代理实现的,动态代理正常情况下无法用在非 public 方法上
|
3
zxc1234 OP |
4
coer 2020-04-17 22:06:53 +08:00 via iPad
springboot 的 TransactionAutoConfiguration 类,默认是 cglib
|
5
zxc1234 OP @putaozhenhaochi
@bobuick 如果是 jdk 动态代理,但是好像在实际的开发中 service 并没有实现接口 如果是 cglib 字节码织入,那么是不是 final 类的所有方法事务都不会生效呢? |
7
luopengfei14 2020-04-18 08:27:40 +08:00 via iPhone
补充二楼,事物注解的方法必须由外部类调用。这样才能切面、生成代理管理事务
|