Spring中事务几个常见的问题解决

 更新时间:2022年08月02日 15:47:20   作者:时光清浅ぴ许你安然  
这篇文章主要介绍了Spring中事务几个常见的问题解决,事务这个概念是数据库层面的,Spring只是基于数据库中的事务进行扩展,以及提供了一些能让程序员更新方便操作事务的方式

前言

首先,事务这个概念是数据库层面的,Spring只是基于数据库中的事务进行扩展,以及提供了一些能让程序员更新方便操作事务的方式

Spring如何处理事务

Spring中支持编程式事务和声明式事务管理两种方式

1、编程式事务,可以使用TransactionTemplate

public class B {
    @Autowired
    private TransactionTemplate template;
    
    public void sout(){
        TransactionCallback<Integer> transactionCallback = new TransactionCallback<Integer>() {
            @Override
            public Integer doInTransaction(TransactionStatus transactionStatus) {
                //jdbcTemplate.update
                //jdbcTemplate.update
                if(执行失败){
                    //回滚事务
                    transactionStatus.setRollbackOnly();
                    return -1;
                }
                return 1;
            }
        };

        Integer result =  template.execute(transactionCallback);
    }

当加了@Transactional注解后,Spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当在使用这个代理对象的方法时,如果这个方法上存在@Transactional注解,那么代理逻辑会先把事务的自动提交设置为false,然后再去执行原本的业务逻辑方法,如果执行业务逻辑方法没有出现异常,那么代理逻辑中就会将事务提交,如果执行业务逻辑方法出现了异常,那么会将事务进行回滚。

好处:代码级别的事务控制,可以自己控制事务的逻辑,比较灵活
缺点:太麻烦,需要自己实现所有的事务逻辑

2、声明式事务

是Spring在AOP基础上提供的事务实现机制。

public class B {
    @Autowired
    private TransactionTemplate template;

    @Transactional
    public void sout(){
  System.out.println("=================A=====================");
    }
}

优点:不需要在业务代码中添加事务管理的代码,只需要在配置文件中做相关的事务规则声明规则就可以了。
缺点:只能只能针对方法级别,无法控制代码级别。

Spring事务传播机制

Propagation:多个事务方法相互调用时,事务是如何在这些方法键传播

方法A是一个事务方法。方法A在执行的过程中调用了方法B,那么方法B有无事务以及方法B对事物的要求不同都会对方法A的事务具体执行造成影响,同时方法A的事务对方法B的事务执行也有影响。这种影响具体是什么就由两个方法所定义的事务传播类型所决定

a调用b,以下描述,当前均只a,自己均指b

  • REQUIRED(Spring默认的事务传播类型):如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务。
  • SUPPORTS:当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行
  • MANDATORY:当前存在事务,则加入当前事务,如果当前没有事务,则抛出异常
  • REQUIRES_NEW:创建一个新事务,如果存在当前事务,则挂起该事务(互不干扰)
  • NOT_SUPPORTED:以非事务方法执行,如果当前存在事务,则挂起当前事务。
  • NEVER:不使用事务,如果当前存在事务,则抛出异常
  • NESTED:如果当前存在事务,则嵌套事务中执行,否则REQUIRED操作一样(开启一个事务)

和REQUIRES_NEW的区别:
REQUIRES_NEW是新建一个事务,并且新开启的事务与原事务无关,而NESTED则是当前存在事务时(我们把当前事务成为父事务)会开启一个嵌套事务(称之为一个子事务)。在NESTED情况下父事务回滚时,子事务也会回滚,而在REQUIRES_NEW情况下,原有事务回滚,不会影响新开启的子事务。

和REQUIRED的区别:
REQUIRED情况下,调用方存在事务时,则被调用和调用方法使用同一事务,那么被调用方出现异常时,由于共用一个事务,所以无论调用方法是否catch异常,事务都会回滚(父子事务一起回滚),而在NESTED情况下,被调用方发生异常时,调用发可以catch其异常,这样只有子事务回滚,父事务不受影响(父事务是否需要回滚可以自行决定)

Spring事务隔离级别

  • ISOLATION:Spring的事务隔离级别
  • DEFAULT:使用数据库默认的事务隔离级别
  • READ_UNCOMMITTED:读未提交,允许事务在执行过程中,读取其他事务未提交的数据
  • READ_COMMITTED:读已提交,允许事务在执行过程中,读取其他事务已提交的数据
  • REPEATABLE_READ:可重复读,在同一个事务内,任意时刻的查询结果是一致的
  • SERIALIZABLE:所有事务依次执行

数据库配置的隔离级别是read commited,而spring配置的隔离级别是repeatable read,这个时候隔离级别以哪个为准?
以Spring为准(spring配置的会覆盖数据库的隔离级别),如果Spring配置的隔离级别数据库不支持,效果取决于数据库

到此这篇关于Spring中事务几个常见的问题解决的文章就介绍到这了,更多相关Spring事务 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL查询字段实现字符串分割split功能的示例代码

    MySQL查询字段实现字符串分割split功能的示例代码

    本文主要介绍了MySQL查询字段实现字符串分割split功能的示例代码,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java实现字符串转换成可执行代码的方法

    Java实现字符串转换成可执行代码的方法

    今天小编就为大家分享一篇Java实现字符串转换成可执行代码的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • spring解决循环依赖

    spring解决循环依赖

    这篇文章主要介绍了spring如何解决循环依赖,帮助大家更好的理解和使用spring框架,感兴趣的朋友可以了解下
    2020-09-09
  • 使用springBoot项目配置文件位置调整到打包外

    使用springBoot项目配置文件位置调整到打包外

    这篇文章主要介绍了使用springBoot项目配置文件位置调整到打包外,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • Java集合的总体框架相关知识总结

    Java集合的总体框架相关知识总结

    今天带大家学习Java集合框架的相关知识,文中有非常详细的图文介绍,对正在学习Java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Spring Bean常用依赖注入方式详解

    Spring Bean常用依赖注入方式详解

    这篇文章主要介绍了Spring Bean常用三种依赖注入方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 基于java解析JSON的三种方式详解

    基于java解析JSON的三种方式详解

    这篇文章主要介绍了基于java解析JSON的三种方式,结合实例形式详细分析了json解析的原理与GSON、FastJSON等常用解析操作技巧,需要的朋友可以参考下
    2016-12-12
  • 关于maven项目中使用BCrypt加密方式

    关于maven项目中使用BCrypt加密方式

    BCrypt是一种基于Blowfish加密算法的密码散列函数,用于安全存储和验证用户密码,它通过引入盐和工作因子增加计算复杂度,有效防止彩虹表攻击和破解,BCrypt具备适应性工作因子、成本参数调整、迭代哈希和密钥扩展等特点,被广泛应用于Web应用程序的安全性设计中
    2024-10-10
  • Java 中导入excel时使用 trim() 无法去除空格的问题解决方案

    Java 中导入excel时使用 trim() 无法去除空格的问题解决方案

    这篇文章主要介绍了Java中导入excel时使用trim()无法去除空格的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Java获取控制台输入的两种方法小结

    Java获取控制台输入的两种方法小结

    这篇文章主要介绍了Java获取控制台输入的两种方法小结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论