spring 事务管理终极学习

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39443053/article/details/100602149

spring 事务管理终极学习

   点关注不迷路,欢迎再访!		

大好的周末就重新温故下事务,重新学习视频整理资料。最近沉迷学习,日渐发福。

事务:事务是指逻辑上的一组操作,这组操作要么全部成功,要么全部失败。

一.事务特性:
原子性:事务是一个不可分割的单位,事务中的操作要么发生,要么不发生,不能单独去运行。
隔离性:多个用户并发访问数据库时,一个用户事务不能被其它事务干扰,多个并发事务之间数据要相互隔离。(设置隔离级别可以解决)
一致性:事务前后数据的完整性必须保持一致。
持久性:事务一旦被提交,对数据库中数据的改变就是永久的。即使数据库发生故障也不应该对其有影响。

二.spring接口介绍
spring事务管理高层抽象主要包括三个接口:
1.PlatformTransactionManager 平台事务管理器(包含事务的提交、回滚…)
2.TransactionDefinition 事务定义信息(隔离、传播、超时、只读)
3.TransactionState 事务具体运行状态(事务是否已经提交、是否有保存点、是否新事物)

接口联系:在进行spring事务管理时会首先根据TransactionDefinition定义的信息(例:定义了什么隔离级别,什么传播行为),由PlatformTransactionManager进行真正的事务管理,在管理事务中会产生一些相应的状态,那么状态会保存在TransactionState对象中。

2.1事务管理器接口定义PlatformTransactionManager接口具体实现类:
在这里插入图片描述
*spring为不同的持久化框架提供了不同的PlatformTransactionManager接口实现。
在这里插入图片描述
2.2TransactionDefinition 事务定义信息,ISOLATION隔离级别
在这里插入图片描述
如果不考虑隔离性会引起一些安全性问题如下:
脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这给数据被回滚,则读到的数据是无效的。
不可重复读:在同一事务中,多次读取同一数据返回的结果有所不同。
幻读:一个事务读取了几行记录后,另一事务插入一些记录。幻读就发生了。再后来的查询中,第一个事务就会发现有些原来没有的记录。

事务隔离级别:
数据库为我们提供四种隔离级别:
在这里插入图片描述
DEFAULT:数据库默认隔离级别,Mysql默认采用REPEATABLE_READ隔离级别,Oracle默认采用READ_COMMITTED隔离级别。

定义Summary事务传播行为
主要用来解决业务层方法之间的相互调用问题:
1.实际开发中服务器端分web层,业务层,持久层。
2.事务加在业务层。
3.复杂业务
在这里插入图片描述
从上看Service1()是一个事务,Service2()是一个事务,那么在相互调用过程中事务时怎么传递呢?用的时谁的事务。这个就是我们的事务的传播行为要解决的问题。
问题:在相互调用过程中事务时怎么传递呢?

在这里插入图片描述
案例分析:调用Service1.aaa()和Service2,bbb()
一.操作在同一事务中
PROPAGATION_REQUIRED: 如果调用aaa()的时候又调用bbb(),如果aaa()有事务,bbb()就使用aaa()事务;如果aaa)()无事务,在调用bbb()会创建事务时候,bbb()会创建事务然后把aaa()内容包起来。也就是aaa(),bbb()操作在同一个事务中。

PROPAGATION_SUPPORTS: 如果aaa()有事务bbb()就使用aaa()事务,如果aaa()没有事务bbb()就不使用事务。
PROPAGATION_MANDATORY: 如果aaa()有事务bbb()就使用aaa()事务,如果aaa()没有事务bbb()就抛出异常。
二.不在同一事务中
PROPAGATION_REQUIRES_NEW: 如果aaa()有事务那么把bbb()就会将aaa()事务挂起不使用,自己会创建新事物,此时aaa()和bbb()不再同一事务。
PROPAGATION_NOT_SUPPORTED: 如果aaa()有事务那么把bbb()就会将aaa()事务挂起不使用,然后bbb()来执行。
PROPAGATION_NEVER: 如果aaa()有事务那么j就会抛异常。
三.嵌套事务,设置保存点
PROPAGATION_NESTED: 如果在执行aaa()时,当执行完会使用事务设置保存点;在执行bbb()时,如果bbb()无异常那么就一起执行,如果有异常那么根据自己设定可以回滚到保存点位置,也可以回到最初始状态可以自己控制。

2.3TransactionState 事务具体运行状态
在这里插入图片描述
三.事务管理
1.编程式事务管理
XML需要配置事务管理器和事务管理模板

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 数据源-->
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
      <property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"/>
      <property name="username" value="root"/>
      <property name="password" value="root"/>
   </bean>
   
   <!-- 事务管理器-->
   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource"  ref="dataSource" />    
   </bean>

   <!-- 事务管理模板-->
   <bean id="studentJDBCTemplate" class="com.jsoft.testspring.testtx.StudentJDBCTemplate">
      <property name="dataSource"  ref="dataSource" />    
      <property name="transactionManager"  ref="transactionManager" /> 
   </bean>

</beans>

2.声明式事务管理
基于AOP思想来实现
方式一: XML需要配置事务管理器和事务代理工厂类

<!-- 配置JDBC数据源的局部事务管理器,使用DataSourceTransactionManager类,该类实现了PlatformTransactionManager接口,是针对采用数据源连接的特定实现 -->
<bean id="transactionManager"  class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!-- 配置TransactionManager时需要注入数据源引用 -->
    <property name="dataSource" ref="dataSource" />
</bean>
 
<bean id="newsDao" class="com.abc.dao.impl.NewsDaoImpl">
    <!-- 为业务Bean注入属性 -->
    <property name="dataSource" ref="dataSource" />
</bean>
 
<bean id="newsDaoTransProxy"  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <!-- 为事务代理工厂Bean注入事务管理器 -->
    <property name="transactionManager" ref="transactionManager" />
    <!-- 要在哪个Bean上面创建事务代理对象 -->
    <property name="target" ref="newsDao" />
    <!-- 指定事务属性 -->
    <property name="transactionAttributes">
        <props>
            <prop key="*">PROPAGATION_REQUIRED</prop>
        </props>
    </property>
</bean>

方式二: XML配置声明式事务基于tx/aop
基于AspectJ的XML方式配置


<!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
 
 
    <!-- 配置事务的通知(事务的增强) -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="insert*" propagation="REQUIRED"/>
            <tx:method name="save*" propagation="REQUIRED"/>
            <tx:method name="do*" propagation="REQUIRED"/>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="delete*" propagation="REQUIRED"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="select*" propagation="SUPPORTS" read-only="true"/>
            <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    
     <!-- 配置切面 -->
    <aop:config>
        <!--配置切入点-->
        <aop:pointcut id="transactionPointcut" expression="execution(* com.heyin.zkgj.service..impl..*.*(..))"/>
        <!--配置切面 当配置了多个切入点,可用<aop:aspect来配置多个切面-->
        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/>
    </aop:config>

tx:advice/ 有关的设置
这一节里将描述通过 tx:advice/ 标签来指定不同的事务性设置。默认的 tx:advice/ 设置如下:
事务传播设置是 REQUIRED
隔离级别是 DEFAULT
事务是 读/写
事务超时默认是依赖于事务系统的,或者事务超时没有被支持。
任何 RuntimeException 将触发事务回滚,但是任何 checked Exception 将不触发事务回滚

方式三: 基于注解的事务管理方式
XML配置事务管理器和开启注解事务

<!-- 事务管理器--->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="defaultDataSource" />
</bean>

<!-- 开启注解事务-->
<tx:annotation-driven transaction-manager="txManager" />
@Transactional(propagation=Propagation.REQUIRES_NEW,
			isolation=Isolation.READ_COMMITTED,
			noRollbackFor={UserAccountException.class},
			rollbackFor = IOException.class,
			readOnly=false,
			timeout=3)
	@Override
	public void purchase(String username, String isbn) {}

@Transactional注解中常用参数说明

参数名称 功能描述
readOnly 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)
rollbackFor 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class) 指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
rollbackForClassName 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称:@Transactional(rollbackForClassName=“RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,“Exception”})
noRollbackFor 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
timeout 该属性用于设置事务的超时秒数,默认值为-1表示永不超时
isolation 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
propagation 该属性用于设置事务的传播行为,具体取值可参考表6-7。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
noRollbackForClassName 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName=“RuntimeException”) 指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,“Exception”})

注意的几点:

1、@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.

2、用 spring 事务管理器,由spring来负责数据库的打开,提交,回滚.默认遇到运行期例外(throw new RuntimeException(“注释”);)会回滚,即遇到不受检查(unchecked)的例外时回滚;而遇到需要捕获的例外(throw new Exception(“注释”);)不会回滚,即遇到受检查的例外(就是非运行时抛出的异常,编译器会检查到的异常叫受检查例外或说受检查异常)时,需我们指定方式来让事务回滚要想所有异常都回滚,要加上 @Transactional( rollbackFor={Exception.class,其它异常}) .如果让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)

猜你喜欢

转载自blog.csdn.net/qq_39443053/article/details/100602149
今日推荐