Spring事务处理

Spring的事务处理

Spring提供一种处理事务的统一模型

1、事务

(1)事务是指一组sql语句的集合

(2)事务ACID原则:原子性、一致性、隔离性、持久性

2、Spring事务管理

(1)声明式事务(通过AOP实现) 推荐使用

       =把事务的相关资源和内容提供给Spring,Spring能处理事务提交并回滚

       =在XML配置文件中配置或者直接基于注解

(2)编程式事务 (代码中进行事务管理,手动实现commit\rollback)不检验事务

3、Spring管理事务的流程

(1)使用事务管理器对象 事务内部提交commit 回滚事务rollback

     事务管理器是一个接口 PlatformTransactionManager,定义了事务重要方法(commit\rollback)

     其实现类     MyBatis对应事务管理实现类DataSourceTransactionManager

                        Hibernate对应事务管理实现类HibernateTransactionManager

       xml配置文件bean声明对应的事务管理实现类

       <bean id="xxx" class="...DataSourceTransactionManager">

(2)说明需要事务的类型

       =1、事务隔离级别4个以ISOLATION_开头的值)

          定义了一个枚举类 Isolation

             == ISOLATION_DEFAULT:默认的隔离级别

             == ISOLATION_READ_UNCOMMITTED

                  读未提交 最低的隔离级别,可能导致 脏读、幻读、不可重复读

             == ISOLATION_READ_COMMITTED

                  读可提交 可能导致幻读、不可重复读

             == ISOLATION_REPEATABLE_READ

                 可重复读 可能导致幻读

             == ISOLATION_SERIALIZABLE:

                可序列化 最高级别

     =2、事务的超时时间 TIMEOUT_DEFAULT

        表示一个方法最长的执行时间,超过时间事务就回滚 单位 秒 默认-1

    =3、事务的传播行为(7种)

       表示业务方法调用时,事务在方法间是如何使用的,解决业务层方法之间互相调用的事务问题。

       当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。

              == TransactionDefinition.PROPAGATION_REQUIRED

                   使用最多,注解@Transactional默认这个传播行为

                   当前存在事务,则加入该事务,当前没有事务,就创建一个新事物

                   例如:doOther()方法 在被调用时 若存在事务就在事务中运行 ,若不存在事务中,则创建一个事务并在其中运行

             == TransactionDefinition.PROPAGATION_REQUIRES_NEW

                  总是创建一个新的事务,如果当前存在当前事务,则将当前事务挂起。该传播行为内的修饰方法会新开启一个自己的事务,来执行方法。

                  例如:doSome()方法调用doOther()方法,若有存在事务,则停止,创建新事务执行doOther(),再执行doSome()的被停止的事务 doSome()方法调用doOther()方法,没有事务,doOther()创建新事务执行

             ==TransactionDefinition.SUPPORTS

                 如果当前存在事务,就加入当前事务,若当前没有事务,就以非事务方式继续允许

             ==TransactionDefinition.PROPAGATION_NESTED

                 如果当前存在事务,则创建一个事务嵌套到当前事务中运行,若没有当前事务,则创建一个新的事务

             ==TransactionDefinition.PROPAGATION_MANDATORY

                 如果当前存在事务,则加入该事务,如果当前没有事务,则抛出异常。错误配置事务不会发生回滚

             ==TransactionDefinition.PROPAGATION_NOT_SUPPORTED

                 以非事务方式运行,如果当前存在事务,则挂起当前事务。 错误配置事务不会发生回滚

             == TransactionDefinition.PROPAGATION_NEVER

                 以非事务方式运行,如果存在事务,则抛出异常。 错误配置事务不会发生回滚

(3)事务提交的时机,回滚事务的时机

        =1、业务方法执行成功,没有异常抛出,提交事务 调用commit()

        =2、业务方法抛出运行时异常,执行回滚 调用rollback()

        =3、业务方法抛出非运行时异常,提交事务

4、@Transactional 注解

(1)作用于类上,该类的所有public方法将都具有该类型的事务属性,表示当前方法具有事务

(2)如果该类抛出异常,就会回滚,数据库里的数据也会回滚

    @Transactional()

    @Transactional(rollbackFor=Exception.class)

(3)如果不配置rollbackFor属性,事务只会在遇到运行时异常RuntimeException时,才会发生回滚;配置rollbackFor=Exception.class,事务遇到非运行时异常也会回滚。

(4)@Transactional 所有可选属性

        =1、 propagation

           用于设置事务传播属性。该属性类型为Propagation枚举,默认值为Propagation.REQUIRED

        =2、isolation

          用于设置事务的隔离级别。该属性类型为Isolation枚举,默认值为Isolation.DEFAULT

        =3、readOnly

          用于设置该方法对数据库的操作是否是只读的。该属性为boolean,默认值为false.

        =4、timeout

          用于设置本操作与数据库连接的超时时限。单位为秒,类型为int,默认值为-1,即没有时限。一般不设置,影响因素很多

        =5、rollbackFor

           指定需要回滚的异常类,类型为Class[],默认值为空数组。若只有一个异常类时,可以不使用数组

        =6、rollbackForClassName

           指定需要回滚的异常类类名。类型为String[],默认值为空数组。若只有一个异常类时,可以不使用数组  

        =7、noRollbackFor

           指定不需要回滚的异常类。类型为Class[],默认值为空数组。若只有一个异常类时,可以不使用数组

        =8、noRollbackForClassName

           指定不需要回滚的异常类类名。类型为String[],默认值为空数组,若只有一个异常类时,可以不使用数组

posted @ 2022-04-15 00:27  与长安故里  阅读(248)  评论(0编辑  收藏  举报