【事务注解✈️✈️】@Transactional注解在不同参数配置下的功能实现

2024-04-07 04:04

本文主要是介绍【事务注解✈️✈️】@Transactional注解在不同参数配置下的功能实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

使用场景

         1.单个方法层面

         2.类级别使用

         3.指定异常回滚

         4.跨方法调用事务管理

         5.只读事务

​         6.设置超时时间,超时则自动回滚

         7.隔离级别设置

章末


前言

        小伙伴们大家好,ACID(原子性,一致性,隔离性,持久性)特性相比大家都很熟悉,每种的实现方式也都不同,原子性的要求是指一个操作要么全部执行成功,要么全部失败回滚,不会存在部分成功或者失败的情况,意味着在一个事务中的操作要么全部生效,要么全部取消以此保证数据的一致性和完整性。在SpringBoot 项目中就有@Transactional事务注解,并且可以支持各种场景的使用

使用场景

        1.单个方法层面

        手动抛出一个运行时异常,postman测试下事务是否回滚,如图在控制台成功打印了插入日志,然后抛出了自定义异常,检查下数据库,确实没有该条数据,测试成功

  

         2.类级别使用

        比如 需要控制整个业务实现类都要回滚,可以将注解加到类上方,表明所有方法会在一个事务中执行

@Service
@Transactional
public class UserService {@Autowiredprivate UserRepository userRepository;public void updateUser(User user) {userRepository.save(user);}public void addUser(User user) {userRepository.add(user);}...
}

        3.指定异常回滚

         在Spring中默认情况下,只有当抛出的异常是 RuntimeException 或者子类时,事务才会回滚,为了让事务在抛出 Exception 也回滚,可以通过自定义配置 rollbackfor 属性来指定需要回滚的异常类型 

        通过测试发现,控制台正常打印插入日志,然后抛出异常,数据库中不会有该条数据,回滚成功

        4.跨方法调用事务管理

        在当前使用了事务方法中调用另一个方法,并且该方法需要事务管理,可以使用 Propagation.REQUIRES_NEW 属性开启,如下,把抛出异常的代码块放到单独的方法中,并且将这段调用方法捕获打印 

       即在同一个类中,saveUser方法会在一个新的事务中执行,不受外部事务的影响

       测试结果如下,由于手动捕获的原因,现在可以正确插入数据

 

         5.只读事务

        在注解上面开启属性(默认为false)  ,则该方法中涉及到的操作限制为只读

        测试如图,控制台提示操作失败,原因是该连接限定了只读

         6.设置超时时间,超时则自动回滚

        测试如下,设置时间为1s (默认单位:秒),看到控制台提示超时信息

         7.隔离级别设置

        Mysql中的隔离机制默认是可重复读,可以解决幻读(两次查询中间有新数据提交)和不可重复读的问题(两次查询中间有老数据修改),可重复读的原理大概是用到了MVCC(多版本并发控制),第一次查询的时候会生成当前版本的视图,后面查询也是查这里的数据

  1. isolation:指定事务的隔离级别,默认为 Isolation.DEFAULT。事务隔离级别决定了多个事务之间的相互影响程度。常见的隔离级别包括:

    • Isolation.DEFAULT:使用默认的隔离级别。
    • Isolation.READ_UNCOMMITTED:允许读取未提交的数据变更。
    • Isolation.READ_COMMITTED:只能读取已提交的数据变更。
    • Isolation.REPEATABLE_READ:可重复读取相同的数据,直到事务结束。
    • Isolation.SERIALIZABLE:所有事务依次执行,避免并发问题。

章末

        文章到这里就结束了~ 

这篇关于【事务注解✈️✈️】@Transactional注解在不同参数配置下的功能实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881595

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

20.Spring5注解介绍

1.配置组件 Configure Components 注解名称说明@Configuration把一个类作为一个loC容 器 ,它的某个方法头上如果注册7@Bean , 就会作为这个Spring容器中的Bean@ComponentScan在配置类上添加@ComponentScan注解。该注解默认会扫描该类所在的包下所有的配置类,相当于之前的 <context:component-scan>@Sc

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

IDEA配置Tomcat远程调试

因为不想把本地的Tomcat配置改乱或者多人开发项目想测试,本文主要是记录一下,IDEA使用Tomcat远程调试的配置过程,免得一段时间不去配置到时候忘记(毕竟这次是因为忘了,所以才打算记录的…) 首先在catalina.sh添加以下内容 JAVA_OPTS="-Dcom.sun.management.jmxremote=-Dcom.sun.management.jmxremote.port

SpringBoot集成Netty,Handler中@Autowired注解为空

最近建了个技术交流群,然后好多小伙伴都问关于Netty的问题,尤其今天的问题最特殊,功能大概是要在Netty接收消息时把数据写入数据库,那个小伙伴用的是 Spring Boot + MyBatis + Netty,所以就碰到了Handler中@Autowired注解为空的问题 参考了一些大神的博文,Spring Boot非controller使用@Autowired注解注入为null的问题,得到

ABAP怎么把传入的参数刷新到内表里面呢?

1.在执行相关的功能操作之前,优先执行这一段代码,把输入的数据更新入内表里面 DATA: lo_guid TYPE REF TO cl_gui_alv_grid.CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'IMPORTINGe_grid = lo_guid.CALL METHOD lo_guid->check_changed_data.CALL M

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主