Spring事务(编程式事务声明式事务)

news2024/11/15 21:29:55

Spring中编程式事务的实现:

此方式包含了三个重要的操作:获取事务、提交事务、回滚事务。

以及依赖两个重要的对象:DataSourceTransactionManager、TransactionDefinition

 使用编程式事务示例

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @Resource
    private DataSourceTransactionManager transactionManager;
    @Resource
    private TransactionDefinition transactionDefinition;

    //此方法中使用编程式事务
    @RequestMapping("/add")
    public int add(UserInfo userInfo){
        //此处非空校验
        if (userInfo == null || !StringUtils.hasLength(userInfo.getUsername())
                || !StringUtils.hasLength(userInfo.getPassword()))return 0;
        //开启事务(获取事务
        TransactionStatus status = transactionManager.getTransaction(transactionDefinition);
        int result = userService.add(userInfo);
        System.out.println("受影响的行数:"+result);
        //提交事务/回滚事务
        transactionManager.commit(status);//提交事务
        //transactionManager.rollback(status);//回滚事务
        return result;
    }
}

 声明式事务的实现:(依赖注解@Transactional)

关于注解@Transactional,在进入方法之前,自动开启事务,在方法执行完之后,自动提交事务,如果出现异常则自动回滚。

关于注解@Transactional的作用域:

@Transactional除了可以修饰方法之外,还可以修饰类,当它修饰类的时候,则表示当前类中所有的public方法,都回自动的开启和提交(回滚)事务。@Transactional没有放在类上面的时候,那么一定要放在public方法上,否则不能生效。

关于注解@Transactional参数设置:

value: 当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器

transactionManager: 当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器

propagation: 事务的传播行为,默认值为Propagation.REQUIRED

isolation: 事务的隔离级别,默认值为lsolation.DEFAULT

timeout: 事务的超时时间,默认值为-1,如果超过该时间限制但事务还没有完成,则自动回滚事务

readOnly: 指定事务是否为只读事务,默认值为false;为了忽略那些不需要事务的方法,比如读取数据。可以设置read-only为true

rollbackFor: 用于指定能够触发事务回滚的异常类型,可以指定多个异常类型

rollbackForClassName: 用于指定能够触发事务回滚的异常类型,可以指定多个异常类型

noRollbackFor: 抛出指定的异常类型,不回滚事务,也可以指定多个异常类型

noRollbackForClassName: 抛出指定的异常类型,不回滚事务,也可以指定多个异常类型

关于isolation:事务的隔离级别:(5种)

进入isolation源码可以看到5种隔离级别:

DEFAULT:默认事务隔离级别,使用连接的数据库的事务隔离级别

READ_UNCOMMITTED:读未提交

READ_COMMITTED:读已提交

REPEATABLE_READ: 可重复读

SERIALIZABLE:串行化

注意:

1、当Spring 中设置了事务隔离级别和连接的数据库(MySQL)事务隔离级别发生冲突的时候,那么以Spring 的为准。

2、Spring中的事务隔离级别机制的实现是依靠连接数据库支持事务隔离级别为基础。

使用声明式事务示例

//声明式事务
@Transactional(isolation = Isolation.DEFAULT) //在进入方法之前,自动开启事务,在方法执行完之后,自动提交事务,如果出现异常则自动回滚
@RequestMapping("/add1")
public int add1(UserInfo userInfo){
    //此处非空校验
    if (userInfo == null || !StringUtils.hasLength(userInfo.getUsername())
            || !StringUtils.hasLength(userInfo.getPassword()))return 0;
    int result = userService.add(userInfo);
    System.out.println("受影响的行数:"+result);
    return result;
}

 很明显,以上示例是能正常提交事务的,下面咱们手动构造一个算术异常,就可以通过查看数据库看到事务进行了回滚:代码如下(在以上基础上手动构造了一行算术异常)

 

但是这里会有一个注意事项:

当@Transactional + try/catch的时候,这个时候出现异常,事务是不会自动回滚的,因为异常被捕获了之后没有进行任何处理,所以在事务看来一切正常,照常提交事务。当然解决方案有两个:

解决方案1:暴力解决,将异常重新又抛出去,这个时候声明式事务感知到异常了,会进行自动回滚操作:

 

解决方案2:使用代码的方式手动回滚当前事务 

Transactional是怎么实现的?(Transactional的工作原理)

是通过AOP实现的,实现AOP的动态代理来实现的,提供了两种动态代理,一种是采用JDK的动态代理,一种使使用CGLIB动态代理。它的执行细节就是在执行方法之前,存放在IOC容器里面的不是原对象了,而是代理对象。在执行的时候,先执行代理对象的开启事务,然后执行目标对象里面的方法,如果目标对象出现异常了,那么就会rolleck进行回滚了,如果没有问题就会commit提交。

事务有4 大特性

原⼦性:⼀个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执⾏过程中发⽣错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执⾏过⼀样。

⼀致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

隔离性:数据库允许多个并发事务同时对其数据进⾏读写和修改的能⼒,隔离性可以防⽌多个事务并发执⾏时由于交叉执⾏⽽导致数据的不⼀致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串⾏化 (Serializable)。

上⾯ 4 个属性,可以简称为ACID:原⼦性(Atomicity,或称不可分割性) ⼀致性(Consistency) 隔离性(Isolation,⼜称独⽴性) 持久性(Durability)

为什么要设置事务的隔离级别?

设置事务的隔离级别是⽤来保障多个并发事务执⾏更可控,更符合操作者预期的

如何设置Spring 中设置事务隔离?

Spring 事务中的5种隔离级别

1. Isolation.DEFAULT:以连接的数据库的事务隔离级别为主。

2. Isolation.READ_UNCOMMITTED:读未提交,可以读取到未提交的事务,存在脏读。

3. Isolation.READ_COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读,存在不可重复读。

4. Isolation.REPEATABLE_READ:可重复读,解决了不可重复读,但存在幻读(MySQL默认级别)。

5. Isolation.SERIALIZABLE:串⾏化,可以解决所有并发问题,但性能太低。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

进程间通信都有哪些方法?

进程间通信是架构复杂系统的基石。复杂系统往往是分成各种子系统、子模块、微服务等等,按照 Unix 的设计哲学,系统的每个部分应该是稳定、独立、简单有效,而且强大的。系统本身各个模块就像人的器官,可以协同工作。而这个协同的枢…

后端常用的加密算法及hash运算

文章目录 基础知识1.加密三要素2.常用的两种加密方式⭐️3.凯撒密码 对称加密1. 编码概念2. DES — Data Encryption Standard3. 3DES — Triple-DES4. AES — Advanced Encryption Standard5. 分组密码模式6. 在golang中使用对称加密⭐️6.1 填充函数6.2 DESCBC API接口6.3 AE…

Git Clone 报错 `SSL certificate problem: unable to get local issuer certificate`

如果您在尝试克隆Git存储库时得到 “SSL certificate problem: unable to get local issuer certificate” 的错误,这意味着Git无法验证远程存储库的SSL证书。如果SSL证书是自签名的,或者SSL证书链有问题,就会发生这种情况。 $ git clone https://githu…

2021年上半年网络工程师真题详解(全套)

请点击↑关注、收藏,本博客免费为你获取精彩知识分享!有惊喜哟!! 1、以下关于RISC和CISC计算机的叙述中,正确的是( )。 A、RISC不采用流水线技术,CISC采用流水线技术 B、RISC使用…

若依框架AjaxResult改造适应Swagger接口文档

概述 若依框架后端使用的响应对象AjaxResult,和Swagger存在不兼容问题,导致返回体即使使用了Swagger注解,但是Swagger接口文档中,不显示返回体的对象Swagger文档: [外链图片转存失败,源站可能有防盗链机制,建议将图片…

【Linux】Linux入门学习之常用命令二

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

Flutter学习之旅 - 路由

文章目录 Flutter路由介绍普通路由普通路由传值 命名路由将routes的配置提到外面(使用的是Map)命名路由传值 路由跳转返回上一级路由替换路由返回到根路由返回Tabs后到指定页面 Flutter路由介绍 flutter中的路由通俗就是页面跳转。在Flutter中通过Navigator(学过reactjs或小程序…

idea使用Database连接数据库报错ssm证书验证失败无法建立安全连接

项目场景: idea使用Database连接数据库报错ssm证书验证失败无法建立安全连接 问题描述 [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferenc…

Java Agent

摘要 ​ JavaAgent就是Java探针,是一个JVM插件,常用于代码热更新,AOP,JVM监控等功能。这个技术对大多数的同学来说可能有点陌生,但是对Java软件开发人员来说肯定都多多少少接触过,只是相对其原理&#xff…

Selenium技术在CentOS6.8系统的腾讯云服务器上的相关使用

目录 一、解释说明二、操作过程中Linux相关命令1、下载谷歌浏览器2、查看谷歌浏览器的版本3、下载对应版本的谷歌驱动(或者本地上传)4、解压下载的文件5、移动下载文件6、给予文件执行权限7、更新pip3到最高版本8、下载Selenium第三方库9、正式测试10、最…

C#学习笔记--由浅至深理解IEnumerable和IEnumerator

目录 前言总结 IEnumerable 和 IEnumeratorIEnumerable是什么?IEnumerator是什么?总结 结尾预告 前言 上篇文章我是自己实现了一个容器C#学习笔记–实现一个可以重复权重并且能够自动排序的容器–MultiplySortedSet 写完之后突然想到一个问题&#xff…

PMP课堂模拟题目及解析(第6期)

51. 管理层将一个国际项目分配给一位新项目经理。这是该项目经理第一次与团队合作,团队成员位于两个国家,数量平均分布,一个团队由最合适作为个人工作的成员组成,另一个团队由最适合作为团队工作的成员组成。项目经理该怎么做&am…

抖音商城小程序搭建的注意事项

抖音商城小程序已经成为了越来越多电商企业的选择,毕竟它具有强大的用户资源和社交传播力。但是,在搭建抖音商城小程序的过程中,还有一些需要注意的事项。 1、制定明确的策略和目标 在搭建抖音商城小程序前,必须事先制定明确的策…

65.网站个性框架

之前介绍过集中个性网站 严肃优雅型极简主义普通/中性大胆/自信平静祥和创业/上进俏皮/好玩 严肃优雅型 概述 奢华和优雅的设计,基于细小的衬线字体、金色或粉色的颜色和高质量的大图片。 行业 房地产、高端时尚、饰品类,奢侈产品或服务 排版 有衬…

(构造函数的补充2)类型转换与临时变量(新对象)的生成与explicit关键字,类的静态成员变量与成员函数及其应用

(构造函数的补充2)类型转换与临时变量(新对象)的生成与explicit关键字 如果说一个构造函数是单个参数,或者说有多个参数但是第一个参数没有默认值,而其余均有默认值,这时候就特别需要注意类型转换的问题。首先必须得知道的一点就是说一旦有类…

Vue中的键盘事件

目录 一、Vue中的键盘事件的类型 二、keycode指定具体的按键 三、Vue中常用的按键别名 四、Vue自定义按键 五、实现多个按键一起触发事件 一、Vue中的键盘事件的类型 keydown:键盘按下就会触发 keyup:键盘抬起就会触发 二、keycode指定具体的按键 在键盘中,每一…

JMeter测试工具设置中文

JMeter测试工具设置中文 在JMeter中,默认情况下是英文的,如果需要使用中文进行测试,则需要进行如下设置: 第一步、设置JMeter语言选项 在JMeter运行时界面的“Options”菜单中,选择“Choose Language”,…

2023.05.10- 使用Loopback Scaler来改善Stable Diffusion的绘图效果

简介 Loopback Scaler可以添加画面细节 渣图挽救者:在图生图中对原图迭代重绘,修复渣图。脚本在多个循环中处理输入图像,每个循环提高分辨率并优化图像质量。然后,一个循环的图像结果作为下一个循环的输入图像插入,该…

FE_Vue框架的执行流程详解

1 分析脚手架结构 2 整个流程 执行npm run serve,随后来到src中找到【整个项目的入口文件】main.js,这个js页面中引入了Vue、App.vue、关闭了提示等。 // ps: 该文件是整个项目的入口文件 // step1 引入Vue import Vue from vue // step2 引入App组件-…

Android9.0 Charles 模拟器抓包

目录 只想做条安静的咸鱼,混吃等死又一天 一、下载并安装配置Charles 二、下载安装Postern 三、测试抓包 一、下载并安装配置Charles 1.Charles下载网址👇 Charles Web Debugging Proxy • HTTP Monitor / HTTP Proxy / HTTPS & SSL Proxy / Rev…