深入解读Spring Framework事务管理(第一弹:Spring Framework的事务抽象)
2016-12-29 16:16
225 查看
Spring Framework事务管理高层抽象主要包括3个接口:
- PlatformTransactionManager 事务管理器
- TransactionDefinition 事务定义信息(隔离、传播、超时、只读)
- TransactionStatus 事务具体运行状态
要理解Spring Framework的事务抽象,首先就要理解这三个接口。我们来具体看一下这三个接口。
这是一个主要的的service provider interface(SPI)。他里面主要就是三个方法,下面来分别看一下。
这个方法是根据具体的事务传播行为来返回一个当前活动的事务或者创建一个新事务。
返回一个TransactionStatus对象的getTransaction(..)方法需要TransactionDefinition参数。返回的 TransactionStatus可能代表了一个新的事务,也有可能是代表了一个已经存在的事务,如果在调用栈中有已经存在的事务相匹配的话。
这个方法是根据他的status提交给定的事务。
这个方法是回滚给定的事务。
目前已知的实现类有:
AbstractPlatformTransactionManager, CciLocalTransactionManager, DataSourceTransactionManager, HibernateTransactionManager, HibernateTransactionManager, HibernateTransactionManager, JdoTransactionManager, JmsTransactionManager, JpaTransactionManager, JtaTransactionManager, WebLogicJtaTransactionManager, WebSphereUowTransactionManager
其中比较常见的实现是:
org.springframework.jdbc.datasource.DataSourceTransactionManager 使用SpringJDBC或Mybatis作为持久层框架
org.springframework.orm.hibernate3.HibernateTransactionManager 使用Hibernate3作为持久层框架
org.springframework.orm.hibernate4.HibernateTransactionManager 使用Hibernate4作为持久层框架
org.springframework.orm.hibernate5.HibernateTransactionManager 使用Hibernate5作为持久层框架
- ISOLATION_DEFAULT 默认。根据底层的数据源使用默认的隔离级别。
- ISOLATION_READ_UNCOMMITTED 读未提交。会发生脏读、不可重复读和幻读。
- ISOLATION_READ_COMMITTED 读提交。可以避免脏读,但是不可重复读和幻读还是会发生。
- ISOLATION_REPEATABLE_READ 可重复读。可以避免脏读和不可重复读,但是幻读还是会发生。
- ISOLATION_SERIALIZABLE 序列化。脏读、不可重复读和幻读都可以避免。
- getIsolationLevel() 返回事务的隔离级别。
- PROPAGATION_REQUIRED 支持当前事务,如果不存在,就新建一个。
- PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务。
- PROPAGATION_MANDATORY 支持当前事务,如果不存在,就抛出异常。
- PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务。
- PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务。
- PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常。
- PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行。
- getPropagationBehavior() 返回事务的传播行为。
- TIMEOUT_DEFAULT 使用底层事务系统的默认超时,如果不支持就不使用。
- getTimeout() 返回事务的超时时间。
isReadOnly() 返回是否是一个只读事务。
DefaultTransactionAttribute, DefaultTransactionDefinition, DelegatingTransactionAttribute, DelegatingTransactionDefinition, RuleBasedTransactionAttribute, TransactionTemplate
hasSavepoint() 返回当前事务是否包含保存点,也就是说,是否是作为一个基于保存点的嵌套事务来创建的 。
setRollbackOnly() 把事务设为不可提交的。
换句话说,在调用完setRollbackOnly()后你所能执行的唯一操作就是回滚。在大多数情况下,事务管理器会检测到这一点,在它发现事务要提交时会立刻结束事务。
isRollbackOnly() 返回当前事务是否是不可提交的 。
flush() 把底层回话中的修改刷新到数据库。
isCompleted() 返回当前事务是否已经完成,也就是说,是否已经提交或回滚。
AbstractTransactionStatus, DefaultTransactionStatus, SimpleTransactionStatus
- PlatformTransactionManager 事务管理器
- TransactionDefinition 事务定义信息(隔离、传播、超时、只读)
- TransactionStatus 事务具体运行状态
要理解Spring Framework的事务抽象,首先就要理解这三个接口。我们来具体看一下这三个接口。
PlatformTransactionManager
Spring事物抽象的关键就是事务策略的概念。事务策略在接口org.springframework.transaction.PlatformTransactionManager中定义,我们来看一下源码。源码
因为有大量的注释,所以源码看起来很长。我们把注释去掉看一下:package org.springframework.transaction; public interface PlatformTransactionManager { TransactionStatus getTransaction( TransactionDefinition definition) throws TransactionException; void commit(TransactionStatus status) throws TransactionException; void rollback(TransactionStatus status) throws TransactionException; }
这是一个主要的的service provider interface(SPI)。他里面主要就是三个方法,下面来分别看一下。
getTransaction
TransactionStatus getTransaction(TransactionDefinition definition)
这个方法是根据具体的事务传播行为来返回一个当前活动的事务或者创建一个新事务。
返回一个TransactionStatus对象的getTransaction(..)方法需要TransactionDefinition参数。返回的 TransactionStatus可能代表了一个新的事务,也有可能是代表了一个已经存在的事务,如果在调用栈中有已经存在的事务相匹配的话。
commit
void commit(TransactionStatus status)
这个方法是根据他的status提交给定的事务。
rollback
void rollback(TransactionStatus status)
这个方法是回滚给定的事务。
TransactionException
由PlatformTransactionManager接口的任何方法抛出来的TransactionException异常的类型是unchecked的。就是说,它继承自 java.lang.RuntimeException类,我们以有选择地捕获并处理TransactionException。常见实现
Spring为不同的持久层框架提供不同PlatformTransactionManager接口实现。目前已知的实现类有:
AbstractPlatformTransactionManager, CciLocalTransactionManager, DataSourceTransactionManager, HibernateTransactionManager, HibernateTransactionManager, HibernateTransactionManager, JdoTransactionManager, JmsTransactionManager, JpaTransactionManager, JtaTransactionManager, WebLogicJtaTransactionManager, WebSphereUowTransactionManager
其中比较常见的实现是:
org.springframework.jdbc.datasource.DataSourceTransactionManager 使用SpringJDBC或Mybatis作为持久层框架
org.springframework.orm.hibernate3.HibernateTransactionManager 使用Hibernate3作为持久层框架
org.springframework.orm.hibernate4.HibernateTransactionManager 使用Hibernate4作为持久层框架
org.springframework.orm.hibernate5.HibernateTransactionManager 使用Hibernate5作为持久层框架
TransactionDefinition
这个接口处于org.springframework.transaction包下,源码如下。源码
同样,源码太长,我们把注释去掉看一下:package org.springframework.transaction; import java.sql.Connection; public interface TransactionDefinition { int PROP c6ac AGATION_REQUIRED = 0; int PROPAGATION_SUPPORTS = 1; int PROPAGATION_MANDATORY = 2; int PROPAGATION_REQUIRES_NEW = 3; int PROPAGATION_NOT_SUPPORTED = 4; int PROPAGATION_NEVER = 5; int PROPAGATION_NESTED = 6; int ISOLATION_DEFAULT = -1; int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED; int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED; int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ; int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE; int TIMEOUT_DEFAULT = -1; int getPropagationBehavior(); int getIsolationLevel(); int getTimeout(); boolean isReadOnly(); String getName(); }
源码分析
这个接口里面有不少的属性和方法,我们分组来看一下:隔离级别(Isolation)
定义当前事务和其他工作的事务独立的程度。例如,当前事务能否感知到其他事务未提交的写请求?- ISOLATION_DEFAULT 默认。根据底层的数据源使用默认的隔离级别。
- ISOLATION_READ_UNCOMMITTED 读未提交。会发生脏读、不可重复读和幻读。
- ISOLATION_READ_COMMITTED 读提交。可以避免脏读,但是不可重复读和幻读还是会发生。
- ISOLATION_REPEATABLE_READ 可重复读。可以避免脏读和不可重复读,但是幻读还是会发生。
- ISOLATION_SERIALIZABLE 序列化。脏读、不可重复读和幻读都可以避免。
- getIsolationLevel() 返回事务的隔离级别。
传播行为(Propagation)
通常,在一个事务的范围内执行的代码也都在那个事务里面执行。然而,你可以拥有定义当一个事务相关的方法在一个事务上下文已经存在时的行为。例如,代码可以在已经存在的事务中继续运行;或者将那已经存在的事务挂起然后新建一个事务。- PROPAGATION_REQUIRED 支持当前事务,如果不存在,就新建一个。
- PROPAGATION_SUPPORTS 支持当前事务,如果不存在,就不使用事务。
- PROPAGATION_MANDATORY 支持当前事务,如果不存在,就抛出异常。
- PROPAGATION_REQUIRES_NEW 如果有事务存在,挂起当前事务,创建一个新的事务。
- PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务。
- PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常。
- PROPAGATION_NESTED 如果当前事务存在,则嵌套事务执行。
- getPropagationBehavior() 返回事务的传播行为。
超时(Timeout)
事务多长时间会计时归零并自动调用底层事务单元进行回滚。- TIMEOUT_DEFAULT 使用底层事务系统的默认超时,如果不支持就不使用。
- getTimeout() 返回事务的超时时间。
只读状态(Read-only status)
一个设置了只读的事务可以在你的代码需要读但是却不会修改数据的时候使用。isReadOnly() 返回是否是一个只读事务。
事务名称(Transaction name)
getName() 返回事务的名称。常见实现
目前有如下实现:DefaultTransactionAttribute, DefaultTransactionDefinition, DelegatingTransactionAttribute, DelegatingTransactionDefinition, RuleBasedTransactionAttribute, TransactionTemplate
TransactionStatus
接口TransactionStatus提供了一个操控事务执行和查询事务状态的简单方法。源码
我们还是先来看一下注释去掉了的源码:package org.springframework.transaction; import java.io.Flushable; public interface TransactionStatus extends SavepointManager, Flushable { boolean isNewTransaction(); boolean hasSavepoint(); void setRollbackOnly(); boolean isRollbackOnly(); @Override void flush(); boolean isCompleted(); }
源码分析
isNewTransaction() 返回当前事务是不是一个新的事务。hasSavepoint() 返回当前事务是否包含保存点,也就是说,是否是作为一个基于保存点的嵌套事务来创建的 。
setRollbackOnly() 把事务设为不可提交的。
换句话说,在调用完setRollbackOnly()后你所能执行的唯一操作就是回滚。在大多数情况下,事务管理器会检测到这一点,在它发现事务要提交时会立刻结束事务。
isRollbackOnly() 返回当前事务是否是不可提交的 。
flush() 把底层回话中的修改刷新到数据库。
isCompleted() 返回当前事务是否已经完成,也就是说,是否已经提交或回滚。
常见实现
目前已有的实现如下:AbstractTransactionStatus, DefaultTransactionStatus, SimpleTransactionStatus
相关文章推荐
- 深入解读微服务架构下分布式事务解决方案
- 深入解读php中关于抽象(abstract)类和抽象方法的问题分析
- 深入解读Spring Framework事务管理(第四弹:基于@Transactional注解的声明式事务管理)
- 深入解读Spring Framework事务管理(第五弹:同时执行事务通知和自定义的分析通知)
- 深入解读php中关于抽象(abstract)类和抽象方法的问题分析
- 深入解读php中抽象(abstract)类和抽象方法
- 深入解读Spring Framework事务管理(第二弹:编程式事务管理的使用方式)
- RabbitMQ系列(四)RabbitMQ事务和Confirm发送方消息确认——深入解读
- 深入解读微服务架构下分布式事务解决方案
- 深入解读Spring Framework事务管理(第三弹:基于AspectJ的XML声明式事务管理)
- 深入解读Spring Framework IoC容器(第一弹:IoC容器和Bean概述)
- Oracle 学习笔记 图解深入剖析一个事务的操作流程
- 【深入Java编程】JVM源码分析之堆外内存完全解读
- 深入解读C语言中的符号常量EOF
- 深入解读Service Mesh的数据面Envoy
- 深入解读JavaScript中的Iterator和for-of循环
- 解读 JavaScript 之深入探索 WebSockets 和 HTTP/2
- 深入解读PHP类phpExcel应用
- 深入Java事务的原理与应用
- 深入理解读写锁—ReadWriteLock源码分析