spring是如何控制事务的提交和回滚
加上@Transactional注解之后,Spring可以启到事务控制的功能了,再正式执行方法前它会做一些操作,我们来看看
首先进入CglibAopProxy.class
的intercept方法或者JdkDynamicAopProxy.class
的invoke方法(继承接口方式),根据不同实现方法选择不同的动态代理类
CglibAopProxy.class
JdkDynamicAopProxy.class 此处动态代理具体是指目标对象的目标方法,可以debug Evaluate看出 进去之后我们来到ReflectiveMethodInvocation.class
然后一步一步往下走来到 invoke方法 进入 invoke方法来到 TransactionInterceptor.class
继续往下,进入 invokeWithinTransaction方法,来到 TransactionAspectSupport.class
的 invokeWithinTransaction方法, invocation.proceedWithInvocation
spring事务是环绕通知 进入 createTransactionIfNecessary方法,如图 出现异常时进入 completeTransactionAfterThrowing方法,可以看到 rollback() 没有异常则继续往下commit @Transactional 事务注解是如何产生作用的?
如上所说,事务最开始是先进入CglibAopProxy.class
的intercept方法或者JdkDynamicAopProxy.class
的invoke方法,可以看出这2个类都是AOP增强类,所以@Transactional 事务注解才可以产生作用。
有哪些不同类型的事务
来到TransactionAspectSupport.class
的 createTransactionIfNecessary方法
AbstractPlatformTransactionManager.class
@Transactional注解代码如图所示 来看看如果存在事务,进入handleExistingTransaction方法,如图 简单时序图
- 挂起:在新方法里面,不使用外部的事务环境
- 嵌套事务:
- 保存点: