spring提供了可配置、易扩展的事务处理框架,本文主要从一下几个方面说明spring事务的原理java
在同时进行多个事务的时候,可能会出现脏读、不可重复读、幻读四种状况,数据库分别有四种隔离级别处理这些状况。Spring中TransactionDefinition定义了事务的隔离级别和传播属性,隔离级别有spring
传播属性:定义了多层事务时候的行为,spring的TransactionDefinition定义了7种事务传播行为数据库
spring支持编程式事务,也支持声明式事务,这里以声明式事务的配置为例。编程
在配置事务管理器的时候配置为使用cglib生成代理框架
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
上面xml配置的做用spa
# tx命名空间的处理类 org.springframework.transaction.config.TxNamespaceHandler # annotation-driven标签的解析类 org.springframework.transaction.config.AnnotationDrivenBeanDefinitionParser # 解析标签annotation-driven的方法 org.springframework.transaction.config.AnnotationDrivenBeanDefinitionParser.AopAutoProxyConfigurer#configureAutoProxyCreator
解析该标签的时候作了如下的事代理
上面解析标签的时候注入的这些bean在getBean的时候会起做用,在getBean的时候会判断是否须要返回包装后的bean,也就是org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#wrapIfNecessary方法,找到全部的advisor(顺便完成初始化),而后判断找出全部能够应用到该类的advisor(org.springframework.aop.support.AopUtils#findAdvisorsThatCanApply),而后利用可用的advisor建立proxy(org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#createProxy),这个proxy就是原来类的代理,在请求该类的方法的时候是经过代理进行的,在代理中会判断是否有事务,是否须要开启事务code
Spring 事务处理是基于AOP实现的,为事务方法所在类生成一个代理类,在调用事务方法的时候实际会调用代理类的代理方法,这里就是component
org.springframework.transaction.interceptor.TransactionInterceptor#invoke
在看spring事务处理流程以前,咱们先回顾下直接使用jdbc编程的时候使用事务的流程xml
spring事务处理的流程也基本类似,只是作了一些封装
spring事务在屏蔽了一些繁琐逻辑的同时,也提供了比较好的扩展性,好比支持自定义数据源,自定义事务管理器,并且支持在事务执行先后加入本身的回调用方法。