AopContext.currentProxy的原理和实战(解决同一个类中方法嵌套事务的失效问题)

@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
public class TransactionTest {

    /**
     * 方法A没事务
     *
     * @param
     * @return void
     */

    public String A(){
        System.out.println("A方法执行开始!!!");
        //生成TransactionTest代理类,再调用B方法,B的事务就回单独生效,并且异常回滚
        String result = ((TransactionTest)AopContext.currentProxy()).B();
        System.out.println("A方法执行结束!!!");
        return result;
    }

    /**
     * 事务B单独的事务
     * 使用代理,同一类中A方法调用B方法事务可以生效
     * @param
     * @return void
     */
    @Transactional(rollbackFor = Exception.class)
    public String B(){
        return "事务B触发成功!!!";
    }
}

其实AopContext.currentProxy()的本质是使用的ThreadLocal生成本地代理,这样的做法可能影响性能,后续文章对ThreadLocal的内部原理和性能进行进一步深入!

你可能感兴趣的:(笔记)