LXX的网络日志
人因梦想而伟大
初探Spring框架中,@Transactional注解实现事务的源码

TransactionInterceptor

TransactionInterceptor,如果Service的方法里面加了@Transactional注解之后,对Service里面的方法在调用的时候,就会走到TransactionInterceptor的拦截里面去。

这个事务拦截器,会拦截@Transactional注解标注的类中的方法调用。

直接找到TransactionInterceptor,这个类进去看看:​

TransactionInterceptor代码.png

这个类里面最核心的就是invoke()方法:

invoke方法.png

然后这个方法里面,会调用proceedWithInvocation()方法,核心的事务控制的逻辑都在proceedWithInvocation()这个方法里面。

TransactionAspectSupport

proceedWithInvocation()这个方法是在TransactionAspectSupport这个类里面,它是TransactionInterceptor的父类。​

然后进入这个方法一看,有很多的代码,然后大致的看了看,发现不是我要关心的代码​

proceedWithInvocation方法.png

往下翻了翻,看到了这一块代码,貌似是我要找的代码。​

proceedWithInvocation方法2.png

下面这行代码,通过注释看着挺重要的。​

应该是在使用了@Transactional注解的方法上,开启一个事务,然后拿到一个TransactionInfo。

// Standard transaction demarcation with getTransaction and commit/rollback calls.
TransactionInfo txInfo = createTransactionIfNecessary(ptm, txAttr, joinpointIdentification);

然后再来看看这几行代码:​

retVal = invocation.proceedWithInvocation(),这行代码应该是去执行方法里面的业务逻辑。​

如果抛出异常了,就回去执行completeTransactionAfterThrowing(txInfo, ex),这行代码,这行代码我猜测应该是去回滚事务。​

cleanupTransactionInfo(txInfo),这行代码应该是清除事务的一些东西。

Object retVal;
try {
    // This is an around advice: Invoke the next interceptor in the chain.
    // This will normally result in a target object being invoked.
    retVal = invocation.proceedWithInvocation();
}
catch (Throwable ex) {
    // target invocation exception
    completeTransactionAfterThrowing(txInfo, ex);
    throw ex;
}
finally {
    cleanupTransactionInfo(txInfo);
}

大致看了看completeTransactionAfterThrowing()方法里面的代码,发现调用了TransactionInfo.getTrnasactionManager.rollback()方法。​

说明出现异常之后,会去执行事务回滚的逻辑。

completeTransactionAfterThrowing方法.png

回到之前的invokeWithinTransaction()方法中,继续往下看

有一行commitTransactionAfterReturning(txInfo)代码​

commitTransactionAfterReturning(txInfo);


proceedWithInvocation方法3.png

然后点进去看看commitTransactionAfterReturning()方法里面看看:​

看到这行代码,如果上面的业务逻辑执行的没啥问题的话,应该就会去提交事务了。

txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());

commitTransactionAfterReturning方法.png

初探Spring中@Transactional注解实现事务的原理就是这样,大致的分析看了看。​

至于一些细节性的东西为什么没去看呢?​

一个是Spring的框架迭代升级到目前为止已经很复杂了,第二个是等后面逐步的开始去分析Spring框架的核心源码时,再去关注这些细节性的东西。​

目前分析的目的就大致是,通过@Transactional注解,知道如何去实现事务,分析它的的源码、原理而已。