Transaction注解哪些情况不生效?
看一个最简单的CGLIB的例子,感受一下AOP是如何做到的?
1 | /** |
执行后的结果显示
1 | Connected to the target VM, address: '127.0.0.1:55868', transport: 'socket' |
实际上在执行execute()的前后就各自做了自己想要的操作。其实这个就是Spring AOP对简单的一个原型。
@Transaction的工作原理
在Spring中TransactionInterceptor和PlatformTransactionManager这两个类是整个事务模块的核心,TransactionInterceptor负责拦截方法执行,进行判断是否需要提交或者回滚事务。PlatformTransactionManager是Spring 中的事务管理接口,真正定义了事务如何回滚和提交。我们重点研究下这两个类的源码。
TransactionInterceptor类中的代码有很多,我简化一下逻辑,方便说明:
1 | //以下代码省略部分内容 |
其实,这里也就是因为用到了动态代理。在事务回滚这个动作的前前后后可以做自己想要的东西。这是一个非常重要的设计思想。如果我们自己要写框架,这个模式可以作为你的第一参考。








