Spring事务管理

目录

是什么?

怎样运作的?

    普通方式

使用Spring的事务注解管理事务

使用AspectJ的AOP配置管理事务

底层如何实现的?

Spring-Mybatis整合


是什么?

事务是原本是数据库的概念,但是在一般情况下,需要将事务提升到业务层,即Service层,使用事物的特性来管理具体的业务。

三种实现方式

1、使用Spring的事务代理工厂管理事务

2、使用Spring的事务注解管理事务

3、使用AspectJ的AOP配置管理事务

两种接口

1、事务管理器接口 PlatformTransactionManager

      作用:用于完成事务的提交、回滚以及获取事务状态信息

      实现类:DataSourceTransactionManager:使用 JDBC 或 iBatis 进行持久化数据时使用。

                    HibernateTransactionManager:使用 Hibernate 进行持久化数据时使用。

      回滚方式:发生运行时异常回滚,发生受查异常时提交

               原因:运行时异常,在编译时 不要求必须处理(捕获或抛出),但只要程序健壮可以避免-->一旦发生,无法补救

                          受查异常,代码编写时必须捕获或抛出的异常,不捕获,编译不通过-->可以补救,对异常进行处理

2、事务定义接口 TransactionDefinition

       定义描述事务相关的三类常量(事务隔离级别、事务传播行为、事务默认超时时限), 及对它们的操作

       事务隔离级别
                ISOLATION_DEFAULT: 采用 DB 默认的事务隔离级别。 MySql 的默认为 REPEATABLE_READ; Oracle默认为                                                                  READ_COMMITTED。
                ISOLATION_ READ_UNCOMMITTED: 读未提交。 未解决任何并发问题。
                ISOLATION_READ_COMMITTED: 读已提交。解决脏读,存在不可重复读与幻读。
                ISOLATION_REPEATABLE_READ: 可重复读。解决脏读、不可重复读,存在幻读
                ISOLATION_SERIALIZABLE: 串行化。不存在并发问题。                                      

                spring(数据库)事务隔离级别分为四种(级别递减):
                1、Serializable (串行化):最严格的级别,事务串行执行,资源消耗最大;

                2、REPEATABLE READ(重复读) :保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避                       免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”,但是带来了更多的性能损失。

                3、READ COMMITTED (提交读):大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务                          已修改但未提交的数据,避免了“脏读取”,但不能避免“幻读”和“不可重复读取”。该级别适用于大多数系统。

                 4、Read Uncommitted(未提交读) :事务中的修改,即使没有提交,其他事务也可以看得到,会导致“脏读”、“幻                           读”和“不可重复读取”。

       脏读、不可重复读、幻读:

               脏读:所谓的脏读,其实就是读到了别的事务回滚前的脏数据。比如事务B执行过程中修改了数据X,在未提交前,事                              务A读取了X,而事务B却回滚了,这样事务A就形成了脏读。也就是说,当前事务读到的数据是别的事务想要修                            改成为的但是没有修改成功的数据。

               不可重复读:事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时                                        候,发现数据不匹配了,就是所谓的不可重复读了。也就是说,当前事务先进行了一次数据读取,然后再                                      次读取到的数据是别的事务修改成功的数据,导致两次读取到的数据不匹配,也就照应了不可重复读的语                                      义。

                幻读:事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索                               条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。也就是说,当前事务读第一次取到的                                数据比后来读取到数据条目少。

               不可重复读和幻读比较:
                      两者有些相似,但是前者针对的是update或delete,后者针对的insert

        事务传播行为

                 处于不同事务中的方法在相互调用时,执行期间事务的维护情况。加在方法上。
                 PROPAGATION_REQUIRED: 指定的方法必须在事务内执行。若当前存在事务,就加入到当前事务中;
                                                                     若当前没有事务,则创建一个新事务。最常见, Spring 默认。
                  PROPAGATION_SUPPORTS: 指定的方法支持当前事务,但若当前没有事务,也可以以非事务方式执行。
                  PROPAGATION_MANDATORY: 指定的方法必须在当前事务内执行,若当前没有事务,则直接抛出异常。
                  PROPAGATION_REQUIRES_NEW: 总是新建一个事务,若当前存在事务,就将当前事务挂起,直到新事
                                                                                务执行完毕。
                  PROPAGATION_NOT_SUPPORTED: 指定的方法不能在事务环境中执行,若当前存在事务,就将当前事
                                                                                    务挂起。
                  PROPAGATION_NEVER: 指定的方法不能在事务环境下执行,若当前存在事务,就直接抛出异常。

                  PROPAGATION_NESTED: 指定的方法必须在事务内执行。若当前存在事务,则在嵌套事务内执行;若
                                                                  当前没有事务,则创建一个新事务。

          默认事务超时时限
                  常量 TIMEOUT_DEFAULT 定义事务底层默认超时时限,及不支持事务超时时限设置的 none 值,一般就使用默认值

怎样运作的?

   图片解释

  

在Service接口实例中将Dao层接口作为私有属性,调用Dao接口中的方法。而Dao中接口实现类继承了JdbcDaoSupport类后,就具有了JDBC模板属性。因为JdbcDaoSupport类中有一个JdbcTemplate属性,用于接收JDBC 模板。在配置文件中只要将模板对象注入即可。

普通方式

    

    

使用Spring的事务注解管理事务

通过@Transactional 注解方式,也可将事务织入到相应方法中。只需在配置文件中加入一个 tx 标签,以告诉 spring 使用注       解来完成事务的织入。该标签只需指定一个属性--事务管理器。
 @Transactional 的所有可选属性如下所示:

  • propagation: 用于设置事务传播属性。该属性类型为 Propagation 枚举,默认值为Propagation.REQUIRED。
  • isolation : 用于设置事务的隔离级别 。该属性类型为 Isolation 枚举 ,默认值为Isolation.DEFAULT。
  • readOnly: 用于设置该方法对数据库的操作是否是只读的。该属性为 boolean,默认值为 false。
  • timeout: 用于设置本操作与数据库连接的超时时限。单位为秒,类型为 int,默认值为-1,即没有时限。
  • rollbackFor: 指定需要回滚的异常类。类型为 Class[],默认值为空数组。若只有一个异常类时,可以不使用数组。
  • rollbackForClassName: 指定需要回滚的异常类类名。类型为 String[],默认值为空数组。若只有一个异常类时,可以不使用数组。
  • noRollbackFor: 指定不需要回滚的异常类。类型为 Class[],默认值为空数组。若只有一个异常类时,可以不使用数组。
  • noRollbackForClassName: 指定不需要回滚的异常类类名。类型为 String[],默认值为空数组。若只有一个异常类时,可以不使用数组。

注意:@Transactional 若注解在方法上,只能用于 public 方法上。对于其他非 public方法,如果加上了注解@Transactional,             虽然 Spring 不会报错,但不会将指定事务织入到该方法中。因为 Spring 会忽略掉所有非 public 方法上的@Transaction               注解。

           @Transaction 若注解在类上,则表示该类上所有的方法均将在执行时织入事务。

   

使用AspectJ的AOP配置管理事务

使用 XML 配置事务代理的方式的不足是,每个目标类都需要配置事务代理。当目标类较多,配置文件会变得非常臃肿。
使用 XML 配置顾问方式可以自动为每个符合切入点表达式的类生成事务代理。
  

Spring-Mybatis整合

<!-- 注册属性文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值