• Spring 中事务控制的API介绍


    1、PlatformTransactionManager

    Spring所有事务代理类都是基于PlatformTransactionManager接口的实现。

    此接口是spring的事务管理器,它里面提供了我们常用的操作事务的方法,如下代码片段:

    PlatformTransactionManager包括以下三个操作:

    //获得事务信息
    TransactionStatus getTransaction(TransactionDefinition definition) 
    
    //提交事务
    void commit(TransactionStatus status) 
    //回滚事务
    void rollback(TransactionStatus status)

    我们在开发中都是使用它的实现类,如下:

     1 //用于Spring JDBC以及Mybatis框架的事务代理
     2 DataSourceTransactionManager
     3 //用于Hibernate框架事务代理
     4 HibernateTransactionManager
     5 //用于Jpa框架的事务代理
     6 JpaTransactionManager
     7 //用于JDO框架的事务代码
     8 JdoTransactionManager
     9 //用于Jta事务代理,一个事务跨多资源必须要使用
    10 JtaTransactionManager

    2、TransactionDefinition接口

    ① TransactionDefinition 源码

     1 public interface TransactionDefinition {
     2      //事务的传播行为
     3     int PROPAGATION_REQUIRED = 0;
     4     int PROPAGATION_SUPPORTS = 1;
     5     int PROPAGATION_MANDATORY = 2;
     6     int PROPAGATION_REQUIRES_NEW = 3;
     7     int PROPAGATION_NOT_SUPPORTED = 4;
     8     int PROPAGATION_NEVER = 5;
     9     int PROPAGATION_NESTED = 6;
    10     //事务的隔离级别
    11     int ISOLATION_DEFAULT = -1;
    12     int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;
    13     int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
    14     int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
    15     int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;
    16     int TIMEOUT_DEFAULT = -1;
    17     //获得事务信息
    18     int getPropagationBehavior();
    19     int getIsolationLevel();
    20     int getTimeout();
    21     boolean isReadOnly();
    22     String getName();
    23 }

    ② 说明

      TransactionDefinition是事务定义接口,该接口注意定义了:事务的传播行为,事务的隔离级别,获得事务信息的方法。所以在配置事务的传播行为,事务的隔离级别已经需要获得事务信息时,可以通过查阅该类的代码获得相关信息。

    ③ 事务的传播行为

    问题:事务的传播行为是什么?

    答:我们的业务程序,是通过方法调用另一个方法的。所谓的Spring事务的传播行为,就是指将上一个方法定义的事务处理,是否传递到下一个方法的几种情况。

    问题:为什么会出现事务的传播行为?

    答:原因是因为在处理业务的时候,一条线程有可能出现多个事务处理对象!!事务的传播行为就是用于描述,出现多个事务对象的时候,它们的关系是怎样的!!

    REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)99%

    SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)

    MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常

    REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。

    //查询的时候配置

    NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起

    //查询的时候配置

    NEVER:以非事务方式运行,如果当前存在事务,抛出异常

    NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行REQUIRED类似的操作。

    就是:出现多个事务(操作)时,通过事务的传播行为来设置事务与事务之间的存在关系。

    ④ 事务隔离级别

    所谓的事务隔离级别就是,同一个数据库出现多个不同的线程操作(事务)。每个事务之间的关系就是事务隔离级别。

    MySQL查询数据库当前的隔离级别的语句为:select @@tx_isolation;

    ISOLATION_DEFAULT:默认隔离级别,由数据库本身决定以下四种中的某一种。

    根据现实情况,事务隔离级别有四个。

    根据四个隔离级别,可能会出现,脏读,不可重复读,幻读

    ISOLATION_READ_UNCOMMITTED:可以读取另一个事务未提交的数据

    (一个事务操作时,另一个事务可以查询,也可以提交,还可以读取别的事务没有提交的数据)

    ISOLATION_READ_COMMITTED :只能读已提交的数据,(解决脏读问题,ORACLE默认)

    (一个事务操作(增删改)时,另一个事务可以查询,也可以提交,但是不能读取别的是没有提交的数据)

    ISOLATION_REPEATABLE_READ:是否读取其他事务提交修改后的数据,解决不可以重复读问题(MySQL默认)(在一个事务操作时,另外一个事务不能提交,但是可以查询,适合!!!)

    ISOLATION_SERIALIZABLE:是否读取其他提交增加后的数据,解决幻读问题(在一个事务操作时,例外一个事务不能提交,也不能查询)

    脏读,如图所示:

    不可重复读,如图所示:

    幻读,如图所示:

  • 相关阅读:
    LeetCode(81): 搜索旋转排序数组 II
    2018年6月8日论文阅读
    LeetCode(80):删除排序数组中的重复项 II
    LeetCode(79): 单词搜索
    LeetCode(78):子集
    LeetCode(77):组合
    LeetCode(76): 最小覆盖子串
    LeetCode(75):分类颜色
    LeetCode(74):搜索二维矩阵
    linux 两个查找工具 locate,find
  • 原文地址:https://www.cnblogs.com/maigy/p/10724015.html
Copyright © 2020-2023  润新知