概述
Spring事务管理
Spring将事务管理分成了两类:
* 编程式事务管理
- 手动编写代码进行事务管理(很少使用)
* 声明式事务管理
- 基于TransactionProxyFactoryBean的方式(很少使用)
. 需要为每个进行事务管理的类,配置一个TransactionProxyFactoryBean进行增强
- 基于AspectJ的xml方式(经常使用)
. 一旦配置好,类上不需要添加任何东西
- 基于注解(经常使用)
. 配置简单,需要在业务层类上添加一个@Transactional的注解
1-1事物的概念及特性
事物是指一组逻辑上的操作,要么全部成功,不然全部失败。
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。
1 、原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做。
2 、一致性
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
3 、隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
2-1Spring接口介绍
Spring 事务管理高层抽象主要包括3个接口
PlatformTransactionManager 事务管理器(真正用来管理事务的接口包括提交、回滚)
TransactionDefinition 事务定义信息 (隔离、传播、超时、只读)
TransactionStatus 事务具体运行状态(是否提交,是否有保存点,是否为新的事务)
2-2PlatformTransactionManager接口介绍
2-3事物的传播行为
事务的传播行为:主要是解决业务层方法之间的相互调用的问题
事务的传播行为有七种,又分为三类:
第一类共同点:如果 A 方法中有事务,则调用 B 方法时就用该事务,即:A和B方法在同一个事务中。
PROPAGATION_REQUIRED:如果 A 方法中没有事务,则调用 B 方法时就创建一个新的事务。
PROPAGATION_SUPPORTS:如果 A 方法中没有事务,则调用 B 方法时就不使用该事务。
PROPAGATION_MANDATORY:如果 A 方法中没有事务,则调用 B 方法时就抛出异常。
第二类共同点:A方法和B方法没有在同一个事务里面。
PROPAGATION_REQUIRES_NEW:如果 A 方法中有事务,则挂起并新建一个事务给 B 方法。
PROPAGATION_NOT_SUPPORTED:如果 A 方法中有事务,则挂起。
PROPAGATION_NEVER:如果 A 方法中有事务,则报异常。
第三类:如果 A 方法有的事务执行完,设置一个保存点,如果 B 方法中事务执行失败,可以滚回保存点或初始状态。
PROPAGATION_NESTED :如果当前事务存在,则嵌套事务执行。
2-4TransactionStatus接口介绍
TransactionStatus接口用来记录事务的状态
该接口定义了一组方法,用来获取或判断事务的相应状态信息.
平台事务管理器(PlatformTransactionManager)会根据TransactionDefinition中定义的事务信息(包括隔离级别、传播行为)来进行事务的管理,在管理的过程中事务可能产生了保存点或事务是新的事务等情况,那么这些信息都会记录在TransactionStatus的对象中.
3-1编程式声明管理
为了简化设置事务的代码量,提供了TransactionTemplate事务管理模版类.在哪个地方需要用到事务,那么就在哪个地方注入这个模版.真正进行事务管理是由事务管理器来完成.
①配置事务管理器:TranscationManager,一般在不适用Hibernate的情况下,使用DataSourceTranscationManager,需要注入数据源
②配置事务管理器的事务管理的模板TransactionTemplate依赖于DataSourceTransactionManager数据源事务管理器(PlatformTransactionManager平台事务管理器的实现类).
③配置文件中引入TransactionTemplate类,把数据源事务管理器对象注入到使用的事务的service层的类中,作为该bean的transactionManager属性.
DataSourceTransactionManager数据源管理器又依赖于DataSource.因此把数据源对象注入到数据源管理器的dataSource属性中.
④在service中,要定义一个TransactionTemplate的成员变量,并生成set()方法.因此要把TransactionTemplate的bean注入到Service实体类中的TransactionTemplate类型的属性中。
执行transcationTemplate提供的execute方法,方法中进行事务的操作,这个方法中有个参数,transcationcallback,如果事务出现回滚,将会调用这个参数进行操作。如果匿名内部类要拿到外层包裹它的方法的参数,那么要将参数修饰成final
这里调用模板方法将两个dao操作放在一个事物里
3-2声明式事务管理方式一:基于TransactionProxyFactoryBean的方式
声明式的事务管理是基于AOP的思想完成的.因此需要引用Spring AOP开发需要用到的jar包.
传统的声明式事务管理:
1.配置事务管理器
<bean id="transactionManager" class="..DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="dataSource" class="..">..</bean>
有了连接池才能获取连接,才能够进行事务管理.JdbcTemplate也一样的道理.
2.引用TransactionProxyFactoryBean,TransactionProxyFactoryBean是采用动态代理完成事务管理的,直接配置一个TransactionProxyFactoryBean即可.
TransactionProxyFactoryBean中有4个属性,分别是proxyInterfaces、target、transactionManager、transactionAttributes属性.
proxyInterfaces:该属性配置需要代理的接口
target:该属性配置proxyInterfaces中指定接口的实现类
transactionManager:该属性指定一个TransactionManager
transactionAttributes:该属性指定需要设置proxyInterfaces的接口中需要添加事务的的方法.支持<props>多个配置.因为此属性是Properties类型(java.util.Properties).此类型是键值对的形式.
3-3声明式事务管理方式二:基于AspectJ的XML方式
使用aspectj的xml配置方式
在xml文件中配置事务管理器,注入连接池
配置事务的通知,属性设置应用的方法和传播行为等
配置切面,在切面中,配置切入点,和advisor把切入点和通知联系在一起
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务的通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 配置切面 -->
<aop:config>
<!-- 配置切入点 -->
<aop:pointcut expression="execution(* com.demo3.AccountService.*(..))" id="pointcut1"/>
<!-- 配置切面 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>
3-4声明式事务管理方式三:基于注解的方式
配置事物管理器
<bean id="transactiontionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/> //注入连接池
</bean>
开启注解事物
<tx:annotation-driven transacion-manager="transactionManager"/>
在需要开启事物管理的类加上@Transactional注解即可
最后
以上就是虚心蜜粉为你收集整理的Spring事务管理的全部内容,希望文章能够帮你解决Spring事务管理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复