博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring事务管理
阅读量:4049 次
发布时间:2019-05-25

本文共 4251 字,大约阅读时间需要 14 分钟。

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注解即可

你可能感兴趣的文章
让我做你的下一行Code
查看>>
浅析:setsockopt()改善程序的健壮性
查看>>
关于对象赋值及返回临时对象过程中的构造与析构
查看>>
VS 2005 CRT函数的安全性增强版本
查看>>
SQL 多表联合查询
查看>>
Visual Studio 2010:C++0x新特性
查看>>
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
一些socket的编程经验
查看>>
socket编程中select的使用
查看>>
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.147 - LeetCode1108
查看>>
No.174 - LeetCode1305 - 合并两个搜索树
查看>>