Spring事务管理+SpringBoot中事务代码实现

谈谈对Spring中事务管理的理解

结合在慕课网中的课程去谈Spring的事务。

Spring的事务管理提供了三个重要接口,分别是PlatformTransactionManager,TransactionDefinition、TransactionStatus。

我们分别介绍一下,PlatformTransactionManager是Spring为事务提供的平台事务管理器,所有的Spring事务都依赖与该接口或该接口的实现类。其中几个我们比较常用的实现类有DataSourceTransactionManager(Jdbc中的事务管理)、JtaTransactionManager(Jta事务管理)、WeblogicJtaTransactionManager(常见的Jpa事务管理)、HibernateTransactionManager(Hibernate事务管理)等,主要用来对事务进行管理,如事务提交、回滚等。

然后是TransactionDefinition(事务定义器)接口,该接口主要定义了事务的Propagation(传播行为),Isolation(隔离级别),Timeout(超时),以及readOnly(只读)。说到这里我们要谈一下事务的传播行为和隔离级别的知识。

    1、传播行为,Spring事务管理中的传播行为有PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、    PROPAGATION_SUPPORT、PROPAGATION_MANDATORY、PROPAGATION_NOT_SUPPORT、PROPAGATION_NEVER、PROPAGATION_NESTED。

PROPAGATION_REQUIRED:支持当前事务,如果当前事务不存在则新建事务,这是Spring的默认选择

PROPAGATION_REQUIRES_NEW:不支持当前事务,如果当前事务存在则挂起,并使用新事务执行,两个事务之间没有关系

PROPAGATION_SUPPORT:支持当前事务,如果当前事务不存在,则以非事务方式执行

PROPAGATION_MANDATORY:支持当前事务,如果当前事务不存在,则抛出异常

PROPAGATION_NOT_SUPPORT:不支持当前事务,如果当前存在事务,则将事务挂起,以非事务的方式执行

PROPAGATION_NEVER:不支持当前事务,如果当前存在事务,则抛出异常

PROPAGATION_NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。

2、事务的隔离级别

Spring事务中有五种隔离级别,其中四种对应数据库的四种隔离级别,另外一种是默认的隔离级别,根据数据库类型自适应。

ISOLATION_DEFAULT:默认隔离级别,如果时Oracle数据库,默认是ISOLATION_READ_COMMITED,如果时mysql,默认是ISOLATION_REPEATABLE_READ。

ISOLATION_READ_UNCOMMITED:读-不提交,此方式可能会导致脏读、不可重复读和幻读。

ISOLATION_READ_COMMITED:读-提交,此方式可以防止脏读,但可能导致不可重复和幻读。

ISOLATION_REPEATABLE_READ:可重复-读,此方式可以防止脏读和不可重复读,但是可能出现幻读

ISOLATION_SERIALIZABLE:串行,此方式以串行方式执行,代价高,但是能防止脏读、不可重复读、幻读。

至于什么是脏读、不可重复读和幻读:

脏读:是指当前事务读取的数据是另一个事务未提交的内容,当另一个事务回滚后,则当前事务读取的数据为脏数据。

不可重复读:指的是同一事务中多次读取的数据不一致,当前事务读取的数据被另外一个事务修改了,当前事务进行对数据进行处理时,发现数据和数据库中数据不一致。

幻读:指的是当前事务连续几次进行同样的操作,获得的数据条数不一致。侧重的是新增和删除。

TransactionDefinition接口中还提供了一个获取当前事务传播行为和隔离级别的方法:

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.transaction;

import org.springframework.lang.Nullable;

public interface TransactionDefinition {
    .....
    //获取传播行为
    int getPropagationBehavior();
    //获取隔离级别
    int getIsolationLevel();
    //获取设置的超时时间
    int getTimeout();
    //获取是否只读
    boolean isReadOnly();

    @Nullable
    String getName();
}

最后是TransactionStatus接口,该接口提供一些获取当前事务状态的方法

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.transaction;

import java.io.Flushable;

public interface TransactionStatus extends SavepointManager, Flushable {
    //是否是新建事务
    boolean isNewTransaction();
    //是否拥有保存点
    boolean hasSavepoint();
    //设置事务需要回滚
    void setRollbackOnly();
    //是否需要回滚
    boolean isRollbackOnly();
    //用于刷新底层会话中的修改到数据库,一般用于刷新如Hibernate/JPA的会话,可能对如JDBC类型的事 
      务无任何影响;
    void flush();
    //当前事务是否完成
    boolean isCompleted();
}

 

Spring的事务管理相关知识已经了解的差不多了,Spring的事务分类方式有很多种,在实现层面把Spring事务分为编程式和声明式。

下面的项目中对Spring事务使用一种编程式和三种声明式的方式实现,并通过了单元测试。具体实现有需要的同学可以研究代码去吧,这里就不详细讲解了。

具体实现代码:https://github.com/tiedungao/transaction

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值