如:
MySQL事务隔离级别?分别解释下他们的含义,默认的事务隔离级别是什么,Oracle的呢?
Spring事务传播级别?分别代表什么含义
Spring事务是如何处理的?自己能写出来吗?
那么今天一起看一下Spring的事务处理方式。我自己想手写事务的时候,发现还是太依赖Spring框架提供的功能了,自己写对我来说还是有一定的难度,在此分析一下Spring的实现方式。
Spring整个框架包含很多的过程,其中每一个方法内部都包含了很多要处理的事情,都是细节性的问题,我们先不去深究那些细节,感兴趣的可以自己看看。
之前有文章介绍了Spring AOP入门与Advice相关的内容,我之前的文章有写,AOP利用的是动态代理,在我们的方法中,有些方法我们需要进行增强,比如方法周围加上事务的处理,AOP中有个接口是 方法拦截器,借助这个接口我们可以在想要 *** 作的方法外加一些 *** 作。
事务拦截的对象是TransactionInterceptor,可以看出它继承了TransactionAspectSupport. TransactionAspectSupport内部是真正的 *** 作部分。
Spring事务中有几个对象很重要,理解了这几个对象就相当于抓住了总体,剩下的一些细节多花些时间就懂了。
创建事务后返回的对象是TrnsactionInfo对象,因此有必要看一下这个对象都包含了什么信息:
事务传播级别处理是事务中的一个重点,那么源码中如何处理的呢?从创建事务部分开始看
tm.getTransaction,如何获取事务的呢?
真正启动事务的是doBegin方法,其内部把autoCommit设置为false
里面还涉及到一个对象TransactionSynchronizationManager,事务同步管理器,主要是一个Map对象,映射当前Datasource到当前的连接。
另外可以看到,如果是新的事务,当传播级别为这三个的时候,会新建事务
TransactionDefinition.PROPAGATION_REQUIRED
TransactionDefinition.PROPAGATION_REQUIRES_NEW TransactionDefinition.PROPAGATION_NESTED
当传播界别为PROPAGATION_MANDATORY,抛出异常
对存在的事务进行处理
如何得知是否存在事务了呢?
事务对象是否有Connection,并且Connection的事务是否活跃,
(txObject.hasConnectionHolder() &&txObject.getConnectionHolder().isTransactionActive())
Transaction对象是由TransactionSynchronizationManager来控制的。其判断当前的数据源是否有连接对应,用的是ThreadLocal
关于Spring事务处理的部分,先说到这里。主要是提到了事务传播级别与Spring事务的大体架构,更多细节的内容,还要一起探索啊。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)