Spring事务和事务传播机制

目录

Spring中事务的实现

1、通过代码的方式手动实现事务

2、通过注解的方式实现声明式事务

2.1、@Transactional作用范围

2.2、@Transactional参数说明

2.3、注意事项

2.4、@Transactional工作原理

事务隔离级别

1、事务特性

2、Spring中设置事务隔离级别

2.1、MySQL事务隔离级别 

2.2、Spring事务隔离级别

Spring事务传播机制

spring事务传播机制分类

1、Propagation.REQUIRED

2、Propagation.SUPPORTS

3、Propagation.MANDATORY

4、Propagation.REQUIRES_NEW

5、Propagation.NOT_SUPPORTED

6、Propagation.NEVER

7、Propagation.NESTED


Spring中事务的实现

1、通过代码的方式手动实现事务

    @Autowired
    private DataSourceTransactionManager transactionManager;
    @Autowired
    private TransactionDefinition transactionDefinition;


    //1、开启事务
    TransactionStatus transactionStatus=transactionManager.getTransaction(transactionDefinition);

    //手动设置创建时间和修改时间的默认值
    userinfo.setCreatetime(LocalDateTime.now().toString());
    userinfo.setUpdatetime(LocalDateTime.now().toString());


    //2、回滚事务
    //transactionManager.rollback(transactionStatus);

    //3、提交事务
    transactionManager.commit(transactionStatus);

2、通过注解的方式实现声明式事务

@Transactional

1、可以添加在类上或方法上

2、在方法执行前自动开启事务,在方法执行完(没有任何异常)自动提交事务,但是如果在方法执行期间出现异常,那么将自动回滚事务

    @Transactional  //声明式事务(自动提交)
    @RequestMapping("insert")
    public Integer insert(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;
    }

2.1、@Transactional作用范围

修饰方法时:只能用到public方法上,否则不生效

修饰类时:表明该注解对该类中所有的public方法都生效

2.2、@Transactional参数说明

参数

说明

value当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器。
transactionManager当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器.
propagation事务的传播行为默认值为Propagation.REQUIRED
isolation事务的隔离级别,默认值为Isolation. DEFAULT
timeout事务的超时时间,默认值为-1如果超过该时间限制但事务还没有完成则自动回滚事务.
readOnly指定事务是否为只读事务默认值为false;为了忽略那些不需要事务的方法比如读取数据,可以设置read-only为true.
rollbackFor用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。
rollbackForClassName用于指定能够触发事务回滚的异常类型,可以指定多个异常类型.
noRollbackFor抛出指定的异常类型不回滚事务,也可以指定多个异常类型
noRollbackForClassName抛出指定的异常类型.不回滚事务,,也可以指定多个异常类型

2.3、注意事项

当程序中有try-catch。及时程序发生异常,事务也不会回滚

    @Transactional  //声明式事务(自动提交)
    @RequestMapping("insert")
    public Integer insert(Userinfo userinfo){
        //非空效验
        if (userinfo==null || !StringUtils.hasLength(userinfo.getUsername())
                || !StringUtils.hasLength(userinfo.getPassword())){
            return 0;
        }
        int result= userService.add(userinfo);
        System.out.println("添加:"+result);
        try {
            int num=10/0;
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return result;
    }

解决方法:

1、将异常抛出去

    @Transactional  //声明式事务(自动提交)
    @RequestMapping("insert")
    public Integer insert(Userinfo userinfo){
        //非空效验
        if (userinfo==null || !StringUtils.hasLength(userinfo.getUsername())
                || !StringUtils.hasLength(userinfo.getPassword())){
            return 0;
        }
        int result= userService.add(userinfo);
        System.out.println("添加:"+result);
        try {
            int num=10/0;
        } catch (Exception e) {
            //将异常继续抛出
            throw e;
        }
        return result;
    }

2、使用代码手动回滚事务

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

2.4、@Transactional工作原理

事务隔离级别

1、事务特性

原子性

一致性

持久性

隔离性

2、Spring中设置事务隔离级别

2.1、MySQL事务隔离级别 

事务隔离级别脏读不可重复读幻读
读未提交(READ UNCOMMITTED)
读已提交(READ COMMITTED)×
可重复读(REPEATABLE READ)××
串行化(SERIALIZABLE)×××

2.2、Spring事务隔离级别

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

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

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

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

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

通过设置@Transactional里的isolation属性即可 

Spring事务传播机制

spring事务传播机制分类

1、Propagation.REQUIRED

默认传播机制,如果调用链存在事务,则加入事务,如果不存在则创建事务

2、Propagation.SUPPORTS

如果调用链存在事务,则加入事务;如果不存在则非事务方式运行

3、Propagation.MANDATORY

强调必须有事务

4、Propagation.REQUIRES_NEW

5、Propagation.NOT_SUPPORTED

6、Propagation.NEVER

7、Propagation.NESTED

嵌套事务和加入事务的区别:

1、整个事务如果全部执行成功,二者的结果是一样的;

2、如果事务执行到一半失败了,那么加入事务整个事务会全部回滚;而嵌套事务会局部会滚,不会影响上一个方法中执行的结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

插件化架构设计(2):插件化从设计到实践该考量的问题汇总

根据《插件式可扩展架构设计心得》精读扩展版 怎么实现插件化模式 插件模式本质是一种设计思想,并没有一个一成不变或者是万金油的实现。但我们经过长期的代码实践,其实已经可以总结出一套方法论来指导插件体系的实现,并且其中的一些实现细…

菱形继承和C++相关问题

菱形继承和C相关问题菱形继承继承中的同名问题重载加常量情况委托构造菱形继承 菱形继承是因为多继承存在问题而存在的 像这样都是a的话出现二义性&#xff0c;要采用virtual继承&#xff0c;所以菱形继承它也叫虚继承。 #include<iostream> #include<string>usin…

React 用一个简单案例体验一遍 React-dom React-router React-redux 全家桶

一、准备工作 本文略长&#xff0c;建议耐心读完&#xff0c;每一节的内容与上一节的内容存在关联&#xff0c;最好跟着案例过一遍&#xff0c;加深记忆。 1.1 创建项目 第一步&#xff0c;执行下面的命令来创建一个 React 项目。 npx create-react-app react-example cd rea…

Springboot集成Swagger

一、Swagger简介注意点&#xff01; 在正式发布的时候要关闭swagger&#xff08;出于安全考虑&#xff0c;而且节省内存空间&#xff09;之前开发的时候&#xff0c;前端只用管理静态页面&#xff0c; http请求到后端&#xff0c; 模板引擎JSP&#xff0c;故后端是主力如今是前…

公司测试员用例写得乱七八糟,测试总监制定了这份《测试用例编写规范》

统一测试用例编写的规范&#xff0c;为测试设计人员提供测试用例编写的指导&#xff0c;提高编写的测试用例的可读性&#xff0c;可执行性、合理性。为测试执行人员更好执行测试&#xff0c;提高测试效率&#xff0c;最终提高公司整个产品的质量。 一、范围 适用于集成测试用…

【高阶数据结构】红黑树

文章目录1. 使用场景2. 性质3. 结点定义4. 结点旋转5. 结点插入1. 使用场景 Linux进程调度CFSNginx Timer事件管理Epoll事件块的管理 2. 性质 每一个节点是红色或者黑色根节点一定是黑色每个叶子节点是黑色如果一个节点是红色&#xff0c;那么它的两个儿子节点都是黑色从任意…

css属性学习

css属性 就是我们选择器里面 { } 中的内容 字体样式 font-size 控制字体大小&#xff1a;单位px&#xff08;像素&#xff09; 默认字体占16个像素 <p style"font-size:30px;">font-size&#xff1a;字体大小&#xff0c;单位的话可以用px表示占的像素个数&…

Java基础之常见运算符

常见运算符规则图 一、&与&&的区别 Java中&和&&都是逻辑与&#xff0c;需要左右两边同时满足条件才可以得到true的结果。但是&#xff0c;它们之间也有区别&#xff1a; &运算符有两种用法&#xff1a;(1)按位与&#xff1b;(2)逻辑与。 &&…

77.qt qml-QianWindow-V1版本界面讲解

上章介绍: 76.qt qml-QianWindow开源炫酷界面框架简介(支持白色暗黑渐变自定义控件均以适配) 界面如下所示: 代码结构如下所示:

【技术方案】常见库存设计方案-各种方案对比总有一个适合你

文章目录一、背景二、功能三、业务流程四、那么最终系统设计要遵循什么原则&#xff1f;&#xff1f;&#xff1f;五 、具体设计5.1 方案一5.1.1 预占库存5.1.2 扣减库存5.1.3 查询库存5.1.4 超时释放库存5.1.5 问题5.2 方案二&#xff08;异步操作&#xff09;5.2.1 预占库存5…

百度的文心一言 ,没有想像中那么差

robin 的演示 我们用 robin 的演示例子来对比一下 文心一言和 ChatGPT 的真实表现&#xff08;毕竟发布会上是录的&#xff09;。 注意&#xff0c;我使用的 GPT 版本是 4.0 文学创作 1 三体的作者是哪里人&#xff1f; 文心一言&#xff1a; ChatGPT&#xff1a; 嗯&a…

西安石油大学C语言期末重点知识点总结

大一学生一周十万字爆肝版C语言总结笔记 是我自己在学习完C语言的一次总结&#xff0c;尽管会有许多的瑕疵和不足&#xff0c;但也是自己对C语言的一次思考和探索&#xff0c;也让我开始有了写作博客的习惯和学习思考总结&#xff0c;争取等我将来变得更强的时候再去给它优化出…

Linux: 以太网 PHY 驱动简析

文章目录1. 前言2. 背景3. 硬件拓扑4. 以太网卡 PHY 驱动实现4.1 MDIO 总线对象的创建和注册4.2 MDIO 总线从设的 创建注册 和 驱动注册的加载4.2.1 以太网的 PHY 设备创建和注册4.2.2 以太网的 PHY 设备驱动注册和加载4.3 绑定以太网卡的 MAC 和 PHY4.4 以太网卡 PHY 和 MAC 的…

2023年最新最全 VSCode 插件推荐

Visual Studio Code 是由微软开发的一款免费的、针对于编写现代Web和云应用的跨平台源代码编辑器。它包含了一个丰富的插件市场&#xff0c;提供了很多实用的插件。下面就来分享 2023 年前端必备的 VS Code 插件&#xff01; 前端框架 ES7 React/Redux/React-Native snippets …

UE实现建筑分层抽屉展示效果

文章目录 1.实现目标2.实现过程2.1 基础设置2.2 核心函数3.参考资料1.实现目标 使用时间轴对建筑楼层的位置偏移进行控制,实现分层抽屉的动画展示效果。 2.实现过程 建筑抽屉的实现原理比较简单,即对Actor的位置进行偏移,计算并更新其世界位置即可。这里还是基于ArchVizExp…

JavaWeb《一》概念、服务器部署及servlet

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; 本文是javaweb的第一篇&#xff0c;首先介绍了javaweb&#xff0c;然后进行了一个简单的web服务器部署&#xff0c;把我的一个网页发布到了云端&#xff0c;且叫他小Sa&#xff0c;目前啥也没有&#xff0c;之后会使…

在我的MacBook上捣鼓ESP8266

周三是我们的篮球日&#xff0c;打篮球后总是会有些兴奋&#xff0c;然后就容易睡不着&#xff0c;额&#xff0c;睡不着就拿我的ESP8266开发板出来捣鼓一下。先下载编译工具链https://github.com/espressif/ESP8266_RTOS_SDK下载sdkgit clone https://github.com/espressif/ES…

Leetcode138. 复制带随机指针的链表

复制带随机指针的链表 第一步 拷贝节点链接在原节点的后面 第二步拷贝原节点的random &#xff0c; 拷贝节点的 random 在原节点 random 的 next 第三步 将拷贝的节点尾插到一个新链表 ,并且将原链表恢复 从前往后遍历链表 ,将原链表的每个节点进行复制&#xff0c;并l链接到原…

【十二天学java】day01-Java基础语法

day01 - Java基础语法 1. 人机交互 1.1 什么是cmd&#xff1f; 就是在windows操作系统中&#xff0c;利用命令行的方式去操作计算机。 我们可以利用cmd命令去操作计算机&#xff0c;比如&#xff1a;打开文件&#xff0c;打开文件夹&#xff0c;创建文件夹等。 1.2 如何打…

有趣且重要的JS知识合集(18)浏览器实现前端录音功能

1、主题描述 兼容多个浏览器下的前端录音功能&#xff0c;实现六大录音功能&#xff1a; 1、开始录音 2、暂停录音 3、继续录音 4、结束录音 5、播放录音 6、上传录音 2、示例功能 初始状态&#xff1a; 开始录音&#xff1a; 结束录音&#xff1a; 录音流程 &#xf…
最新文章