Spring 事务控制
- JavaEE 体系进行分层开发,事务处理位于业务层,Spring 提供了分层设计业务层的事务处理解决方案。
- spring 框架为我们提供了一组事务控制的接口。这组接口是在spring-tx-5.0.2.RELEASE.jar 中。
- spring 的事务控制都是基于 AOP 的,它既可以使用编程的方式实现,也可以使用配置的方式实现。我们学习的重点是使用配置的方式实现。
Spring中提供事务控制的API
事务管理器:PlatformTransactionManager
此接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法:
//获取事务状态
TransactionStatus getTransaction(TransactionDefinition definition)
//提交事务
void commit(TransactionStatus status)
//回滚事务
void rollback(TransaciontStatus status)
在开发中一般都使用当前接口的实现类。
管理事务的对象:
- 使用SpringJDBC 或 IBatis进行持久化数据时使用:
org.springframework.jdbc.datasource.DataSourceTransactionManager - 使用Hibernate版本进行持久化数据时使用:
org.springframework.orm.hibernate5.HibernateTransactionManger
TransacionDefinition
是事务的定义信息对象,有如下方法:
//获取事务对象名称
String getName()
//获取事务隔离级别
int getlsolationLevel()
//获取事务传播行为
int getPropagationBehavior()
//获取事务超时时间
int getTimeout()
//获取事务是否只读
boolean isReadOnly()
读写型事务:增加、删除、修改开启事务;
只读型事务:执行查询时,也会开启事务;
事务的隔离级别
事务隔离级别反应事务提交并发访问时的处理态度:
- ISOLATION_DEFAULT
默认级别 - ISOLATION_READ_UNCOMMITTED
可读取未提交数据 - ISOLATION_READ_COMMITTED
可能读取已提交数据,解决脏读问题(Oracle默认级别) - ISOLATION_REPEATABLE_READ
是否读取其他事务提交修改后的数据,解决不可重复读问题(MySql默认级别) - ISOLATION_SERIALIZABLE
是否读取其他事务提交添加后的数据
事务的传播行为
事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。
Spring中的7个事务传播行为:
事务行为 | 说明 |
---|---|
PROPAGATION_REQUIRED | 支持当前事务,假设当前没有事务。就新建一个事务 |
PROPAGATION_SUPPORTS | 支持当前事务,假设当前没有事务,就以非事务方式运行 |
PROPAGATION_MANDATORY | 支持当前事务,假设当前没有事务,就抛出异常 |
PROPAGATION_REQUIRES_NEW | 新建事务,假设当前存在事务。把当前事务挂起 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式运行操作。假设当前存在事务,就把当前事务挂起 |
PROPAGATION_NEVER | 以非事务方式运行,假设当前存在事务,则抛出异常 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |
超时时间
默认值是-1,没有超时限制。如果有,以秒为单位进行设置
是否是只读事务
建议查询时设置为只读。
TransactonStatus
该接口描述了某个时间点上事务对象的状态信息,包含6个具体操作
//刷新事务
void flush();
//获取事务是否存在存储点
boolean hasSavepoint();
//获取事务是否完成
boolean isCompleted();
//获取事务是否为新的事务
boolean isNewTransaction();
//获取事务是否回滚
boolean isRollbackOnly();
//设置事务回滚
void setRollbackOnly();
关键词:
关键词 | 读音 | 含义 |
---|---|---|
isolation | [ˌaɪsəˈleɪʃn] | 隔离;隔离状态;孤独;孤立状态 |
serializable | [ˈsɪərɪəlaɪzəbl] | Serializable接口是启用其序列化功能的接口。 |
repeatable | [rɪˈpiːtəbl] | adj.可重复的,(实验、实验结果等)可复验的; |
propagation | [ˌprɒpə’ɡeɪʃ(ə)n] | n. 传播; 扩展; 宣传; 培养; |
required | [rɪˈkwaɪəd] | v. 需要; 依靠; 依赖; 使做(某事); 使拥有(某物); (尤指根据法规) 规定; |
supports | [səˈpɔːts] | v. 支持; 拥护; 鼓励; 帮助; 援助; 资助; 赞助; |
环境搭建
导入spring-tx-5.0.2.RELEASE.jar,或者在maven中配置坐标
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx<artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
Spring事务控制基于XML的配置
在maven中添加坐标
<denpendencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context<artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc<artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx<artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java<artifactId>
<version>5.1.6</version>
</dependency>
</dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver<artifactId>
<version>1.8.7</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit<artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test<artifactId>
<version>5.0.2</version>
</dependency>
</denpendencies>
Spring中基于XML的声明式事务控制配置步骤
<!--
1、配置事务管理器,并注入一个数据源
2、配置事务的通知(需要导入事务的约束,tx名称空间和约束,同事也需要aop的)
使用tx:advice标签配置事务通知
属性:
id:给事务通知起一个位置标识
tranaction-manager:给事务通知提供一个事务管理器引用
3、配置AOP切面
配置AOP中的通用切入点表达式
建立事务通知和切入点之间的关系
4、配置事务的属性
-->
<!--配置事务管理器-->
<bean id="transactionManager" class="org.springframework.datasource.Datasource.DriverManage">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置事务的通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--
配置事务的属性:
issolation:用于指定事务的隔离级别,默认值是DEFAULT,表示使用数据库的默认隔离级别。
propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务。增删改的选择。查询方法可以使用SUPPORTS。
read-only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。
timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。
rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值,表示人事异常都回滚。
no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚。
-->
<tx:attributes>
<tx:method name="*" propgation="REQUIRED" read-only="fasle"/>
<!--当方法比较多的时候可以使用通配符“*”,为了简化配置,建议规范service层方法的命名,比如查询方法以find开头,一般就可以用两条配置完成事务的属性设置。-->
<tx:method name="find*" propgation="SUPPORTS" read-only="true"></tx:method>
</tx:attributes>
</tx:advice>
<!--配置aop-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="pt1" expression="execution(* top.wayneliu.service.impl.*.*(..))"></aop:pointcut>
<!--建立切入点表达式和事务通知的对应关系-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
</aop:config>