Spring 声明式事务 @Transactional(基本使用)

概述

        声明式事务的实现很简单,只需要在需要事务的⽅法上添加 @Transactional 注解就可以实现了.⽆需⼿动开启事务和提交事务,进⼊⽅法时⾃动开启事务,⽅法执⾏完会⾃动提交事务,如果中途发⽣了 没有处理的异常会⾃动回滚事务.

@Transactional 的基本使用

        废话不多说,直接看代码实现,可以更直观的学习

        代码没有截取全,只截取了最核心的代码,其中 userService 对象调用 insertUser 方法可以向数据库中插入数据,知道这个即可

1.创建事务的方法没有抛出异常的情况

        在 registry() 方法前添加 @Transactional 注解,为方法创建事务

         registry() 方法中的代码都正常运行,没有抛出错误,此时事务正常提交

@Transactional@RequestMapping("/registry")public String registry(String userName,String password){//事务执行的内容Integer result=userService.insertUser(userName,password);log.info("成功插入"+result+"条数据");return "注册成功";}

        如下是事务执行完后的日志,可以看出有committing (提交事务),deregistering(销毁事务),closing(关闭事务)等操作

2.创建事务的方法抛出异常的情况

          registry1() 方法中 int a=10/0; 这行代码是错误的,所以方法  registry1() 会抛出错误,此时事务就会自动进行回滚

    @Transactional@RequestMapping("/registry1")public String registry1(String userName,String password){//事务执行的内容Integer result=userService.insertUser(userName,password);log.info("成功插入"+result+"条数据");int a=10/0;return "注册成功";}

        如下是事务执行完后的日志,可以看出有deregistering(销毁事务),closing(关闭事务)等操作

3.创建事务的方法中出现了错误,但错误被捕获的情况

        registry2() 方法中 int a=10/0; 这行代码是错误的,但是错误被捕获并进行了处理,此时方法registry2() 就不会向外抛出错误,那么事务就不会回滚,而是自动提交

        通过这里我们可以看出,事务是以方法为一个整体,并不关心方法中执行的程序有没有错误,只关心方法有没有抛出错误,方法没有抛出错误就自动提交,抛出错误就回滚但不是所有的错误都回滚,后面会举例

@Transactional@RequestMapping("/registry2")public String registry2(String userName,String password){//事务执行的内容Integer result=userService.insertUser(userName,password);log.info("成功插入"+result+"条数据");try {int a=10/0;}catch(Exception e){log.info("发生错误");}return "注册成功";}

        如下是事务执行完后的日志,可以看出有committing (提交事务),deregistering(销毁事务),closing(关闭事务)等操作

4.手动回滚事务

        上述事务的提交和回滚都是自动的,当然也可以手动的进行回滚

        使⽤ TransactionAspectSupport.currentTransactionStatus() 得到当前的事务,并调用 setRollbackOnly() 进行回滚

@Transactional@RequestMapping("/registry3")public String registry3(String userName,String password){//事务执行的内容Integer result=userService.insertUser(userName,password);log.info("成功插入"+result+"条数据");try {int a=10/0;}catch(Exception e){//手动回滚事务TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();}return "注册成功";}

        如下是事务执行完后的日志,可以看出有deregistering(销毁事务),closing(关闭事务)等操作

5.方法抛出的异常不是 RuntimeException 和 Error 的情况

        上面的例子中有提到,不是所有的错误被抛出都会回滚,实际上,默认情况下只有抛出RuntimeException 以及它的子类或 Error 的错误才会回滚

        如下代码,手动抛出了一个 IOException() 异常,IOException() 异常不属于 RuntimeException 的子类,所以事务不会回滚,会直接提交

 @Transactional@RequestMapping("/registry4")public String registry4(String userName,String password) throws IOException {//事务执行的内容Integer result=userService.insertUser(userName,password);log.info("成功插入"+result+"条数据");try {int a=10/0;}catch(Exception e){throw new IOException();}return "注册成功";}

        如下是事务执行完后的日志,可以看出有committing (提交事务),deregistering(销毁事务),closing(关闭事务)等操作

部分异常的分类如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/422876.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux的一些快捷键(hot keyboard)

Ctrl Alt t:打开bash(就是命令框窗口) Ctrl Alt F3~F6:打开tty终端(纯命令行终端,每个Linux发行版不相同,我的是Ubuntu20版) Alt F4:关闭当前窗口(Windo…

【 CSS 】基础 2

“生活就像骑自行车,想要保持平衡,就得不断前行。” - 阿尔伯特爱因斯坦 CSS 基础 2 1. emmet 语法 1.1 简介 Emmet语法的前身是 Zen coding,它使用缩写,来提高 HTML / CSS 的编写速度, VSCode 内部已经集成该语法。…

怎么去除水中的溴酸盐

饮用水溴酸盐超标已成为影响公众健康的严重问题。本文从专业技术角度出发,分析了饮用水中溴酸盐的来源、危害以及去除工艺,并探讨了各种工艺的优劣势。目的在于为饮用水处理提供科学参考,以保障公众健康。 一、饮用水中溴酸盐的来源与危害 …

怎么使用AI人工智能抠图?不妨试试这样做

在数字时代的浪潮中,人工智能技术如春雨般悄然渗透到各个领域,其中尤以图像处理领域为甚。在这场技术的革新中,AI抠图应运而生,它凭借自动识别和提取图像中目标物体的神奇能力,成为图像处理领域的璀璨新星。通过背景与…

国产品牌GC6609与TM2209的参数分析,为什么适用于3D打印机,医疗器械等产品中

步进电机驱动的应用方案目前市场上大多选用国外品牌的电机驱动器,其中trinamic的TMC2208/2209在这一块的应用很广泛。但是由于市场越来越应激。,当前对于产品开发成本要求也越来越低,国产品地准出了相应的TMC2208/2209,因此trinam…

《WebKit 技术内幕》学习之七(2): 渲染基础

2 网页层次和RenderLayer树 2.1 层次和RenderLayer对象 前面章节介绍了网页的层次结构,也就是说网页是可以分层的,这有两点原因,一是为了方便网页开发者开发网页并设置网页的层次,二是为了WebKit处理上的便利,也就是…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据

1.简介 上一篇主要就讲解和分享Fiddler断点的理论和操作,今天宏哥就用具体例子,将上一篇中的理论知识实践一下。而且在实际测试过程中,有时候需要修改请求或响应数据,或者直接模拟服务器响应,此时可以使用fiddler进行…

开源堡垒机JumpServer本地安装并配置公网访问地址

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机,是符合 4A 规范的专业运维安全审计系统。JumpS…

13、Kafka ------ kafka 消费者API用法(消费者消费消息代码演示)

目录 kafka 消费者API用法消费者API使用消费者API消费消息消费者消费消息的代码演示1、官方API示例2、创建消费者类3、演示消费结果1、演示消费者属于同一个消费者组2、演示消费者不属于同一个消费者组3、停止线程不适用4、一些参数解释 代码生产者:MessageProducer…

用通俗易懂的方式讲解:使用 MongoDB 和 Langchain 构建生成型AI聊天机器人

想象一下:你收到了你梦寐以求的礼物:一台非凡的时光机,可以将你带到任何地方、任何时候。 你只有10分钟让它运行,否则它将消失。你拥有一份2000页的PDF,详细介绍了关于这台时光机的一切:它的历史、创造者、…

室内设计3d建模素材网站哪家比较好?

设计师工作时往往需要寻找3D建模素材网站以获得灵感以及提升工作效率,那么室内设计3D建模素材网站比较好的有: 1、建E网:这是一个室内设计3D建模素材网站,提供优质且全面的3D建模素材资源,并包括多种实用工具&#xff…

C语言爬虫程序编写的爬取APP通用模板

互联网的飞快发展,尤其是手机终端业务的发展,让越来越多的事情都能通过手机来完成,电脑大部分的功能也都能通过手机实现,今天我就用C语言写一个手机APP类爬虫教程,方便后期拓展APP爬虫业务。而且这个模板是通用的适合各…