本文共 1625 字,大约阅读时间需要 5 分钟。
@Controllerclass ServiceImpl{ @Autowired private UserService userService; public void doInsert(){ this.insert(); //或者直接doInside();效果是一样的 } @Transactional private void insert(){ //do sql statement }}@Controllerclass Test { @Autowired private ServiceImpl userService; public void test(){ userService.insert(); }}
@Transactional的实现原理是在业务方法外边通过Spring AOP包上一层事务管理器的代码(即插入切面, 切面上有事务的通知)
Spring AOP的底层有2种实现:JDK动态代理、CGLIB。前者的原理是JDK反射,并且只支持Java接口的代理;后者的原理是继承(extend)与覆写(override),因此能支持普通的Java类的代理。两种方式都是动态代理,即运行时实时生成代理。
无论是何种代理, 代理类只是增强了被代理类,spring的事务管理机制是给代理类配置了, 并没有给被代理类配置事务管理器
也就是说我们通过AOP切面是给代理类配置了事务管理机制, 并没有给被代理类配置事务管理机制, 我们知道通过代理类执行的方法最后还是要执行被代理类中的方法, 问题就出现在这,我们执行一个没有配置事务的代理类方法的时候,最后实在被代理类中执行了另一个方法, 而另一个方法在代理类中配置了事务管理机制, 但是我执行的是被代理类中的方法, 所以就不涉及到事务
最后还有一点就是@Transactional 在方法上和类上的区别
转载地址:http://fnsci.baihongyu.com/