深入解读Spring Framework事务管理(第一弹:Spring Framework的事务抽象)
来源:互联网 发布:新手开淘宝店详细步骤 编辑:程序博客网 时间:2024/06/06 11:15
Spring Framework事务管理高层抽象主要包括3个接口:
- 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 PROPAGATION_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
- 深入解读Spring Framework事务管理(第一弹:Spring Framework的事务抽象)
- 深入解读Spring Framework事务管理(第五弹:同时执行事务通知和自定义的分析通知)
- 深入解读Spring Framework事务管理(第二弹:编程式事务管理的使用方式)
- 深入解读Spring Framework事务管理(第三弹:基于AspectJ的XML声明式事务管理)
- 深入解读Spring Framework事务管理(第四弹:基于@Transactional注解的声明式事务管理)
- 深入解读Spring Framework Web MVC(第一弹:Spring Web MVC概述)
- 深入解读Spring Framework IoC容器(第一弹:IoC容器和Bean概述)
- 深入解读Spring Framework IoC容器(第二弹:依赖注入的方式)
- 深入解读Spring Framework IoC容器(第六弹:Bean的作用域)
- 深入解读Spring Framework IoC容器(第七弹:不同作用域Bean的依赖)
- 深入解读Spring Framework IoC容器(第八弹:Bean的初始化和销毁)
- 深入解读Spring Framework Web MVC(第七弹:@ModelAttribute的使用)
- 深入解读Spring Framework Web MVC(第八弹:@SessionAttributes的使用)
- 深入解读Spring Framework IoC容器(第三弹:依赖注入配置详解)
- 深入解读Spring Framework IoC容器(第四弹:p命名空间和c命名空间)
- 深入解读Spring Framework IoC容器(第五弹:懒加载)
- 深入解读Spring Framework Web MVC(第二弹:DispatcherServlet详解)
- 深入解读Spring Framework Web MVC(第三弹:使用@Controller定义控制器)
- uCOS_II系统实操_外部中断
- 命名空间"Microsoft.Office"中不存在类型或命名空间名"Core"
- spring配置datasource三种方式 数据库连接池
- 获取手机中安装的所有App
- java中注意变量初始化问题
- 深入解读Spring Framework事务管理(第一弹:Spring Framework的事务抽象)
- 【软件测试】边界测试中所选择的输入测试数据一定是有效数据(错)
- 网易新闻详情页排版实现思路
- TestNG.XML初级指南
- EOJ 1812 二叉树的深度
- mkimage制作linux内核映像 即uImage是怎么制作的
- easyui + jquery +ajax + c# 实时看板开发总结
- style 页面
- 在使用视频框架Vitamio时需注意的问题