Java框架学习之Spring的事务管理

(1).基本定义:
大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销。Spring事务管理基于底层数据库本身的事务处理机制。数据库事务的基础,是掌握Spring事务管理的基础。

Spring的事务管理主要包括3个接口:
1.TransactionDefinition:封装事务的隔离级别,超时时间,是否为只读事务(处理查询操作)和事务的隔离级别和传播规则等事务属性,可通过XML配置具体信息。
2.PlatformTransactionManager:根据TransactionDefinition提供的事务属性配置信息,创建事务。
3.TransactionStatus:封装了事务的具体运行状态。比如,是否是新开启事务,是否已经提交事务,设置当前事务为rollback-only等。

Spring的事务管理:
1,PlatformTransactionManager:接口统一抽象处理事务操作相关的方法;
①:TransactionStatus getTransaction(TransactionDefinition definition):
根据事务定义信息从事务环境中返回一个已存在的事务,或者创建一个新的事务,并用TransactionStatus描述该事务的状态。
②:void commit(TransactionStatus status):
根据事务的状态提交事务,如果事务状态已经标识为rollback-only,该方法执行回滚事务的操作。
③:void rollback(TransactionStatus status):
将事务回滚,当commit方法抛出异常时,rollback会被隐式调用
2,在使用spring管理事务的时候,首先得告诉spring使用哪一个事务管理器;
3,常用的事务管理器:
DataSourceTransactionManager:使用JDBC,MyBatis的事务管理器;
HibernateTransactionManager:使用Hibernate的事务管理器;

(2).事务具备ACID四种特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。
1.原子性(Atomicity)
事务最基本的操作单元,要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
2.一致性(Consistency)
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。
3.隔离性(Isolation)
指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。
4.持久性(Durability)
指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。

(3).事务的传播特性
事务传播行为就是多个事务方法调用时,如何定义方法间事务的传播。Spring定义了7中传播行为:
1.propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是Spring默认的选择。
2.propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
3.propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
4.propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
5.propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6.propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
7.propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作。
在这里插入图片描述

(4).事务的隔离级别
1.read uncommited:是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。
2.read commited:保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。
3.repeatable read:这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生(不可重复读)。
4.serializable:这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读

(5).事务几种实现方式
1.编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
2.基于 TransactionProxyFactoryBean的声明式事务管理
3.基于 @Transactional 的声明式事务管理
4.基于Aspectj AOP配置事务

(5).声明式事务管理-基于xml配置:

<!-- 配置一个事务管理器 -->
 		<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 			<property name="dataSource" ref="dataSource"></property>
 		</bean>
 		<!-- 将事务管理器打包:环绕通知 -->
 		<tx:advice id="txAdvice" transaction-manager="txManager">
 			<!-- 为对应的方法指定所在事务空间的属性 -->
 			<tx:attributes>
 				<tx:method name="transfer"/>
 				<!-- 
 					查询相关的设置为只读,其他设置为默认(可读写)
 					匹配的规则是从上到下的
 				 -->
 				<tx:method name="get*" read-only="true"/>
 				<tx:method name="list*" read-only="true"/>
 				<tx:method name="query*" read-only="true"/>
 				<tx:method name="*"/>
 			</tx:attributes>
 		</tx:advice>
 		<!-- 使用aop将事务管理的代码植入到指定的位置 -->
 		<aop:config>
 			<aop:pointcut expression="execution(* com.tx.service.*.*(..))" id="pc"/>
 			<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
 		</aop:config>

在这里插入图片描述
事务方法属性:
1,name:匹配到的方法模式;
2,read-only:如果为true,开启一个只读事务,只读事务的性能较高,但是不能再只读事务中,使用DML;
3,isolation:代表数据库事务隔离级别(就使用默认)
DEFAULT:让spring使用数据库默认的事务隔离级别;
其他:spring模拟;
4,no-rollback-for: 如果遇到的异常是匹配的异常类型,就不回滚事务;
5,rollback-for:如果遇到的异常是指定匹配的异常类型,才回滚事务;
spring默认情况下,spring只会去回滚RuntimeException及其子类,不会回滚Exception和Thowable.
6,propagation:事务的传播方式(当一个方法已经在一个开启的事务当中了,应该怎么处理自身的事务)
1,REQUIRED(默认的传播属性):如果当前方法运行在一个没有事务环境的情况下,则开启一个新的事务,如果当前方法运行在一个已经开启了的事务里面,把自己加入到开启的那个事务中
2,REQUIRES_NEW:不管当前方法是否运行在一个事务空间之内,都要开启自己的事务

(6).声明式事务管理-基于注解配置:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值