事务管理-spring

news2024/11/15 7:47:37

 什么是事务

 - 事务是由N步数据库操作序列组成的逻辑执行单元,这系列操作要么全执行,要么全放弃执行。

• 事务的特性(ACID)

- 原子性(Atomicity):事务是应用中不可再分的最小执行体。

- 一致性(Consistency):事务执行的结果,须使数据从一个一致性状态,变为另一个一致性状态。

 - 隔离性(Isolation):各个事务的执行互不干扰,任何事务的内部操作对其他的事务都是隔离的。

 - 持久性(Durability):事务一旦提交,对数据所做的任何改变都要记录到永久存储器中。

事务的隔离性

• 常见的并发异常

- 第一类丢失更新、第二类丢失更新。

 - 脏读、不可重复读、幻读。

 • 常见的隔离级别

- Read Uncommitted:读取未提交的数据。

- Read Committed:读取已提交的数据。

 - Repeatable Read:可重复读。

- Serializable:串行化

第一类丢失更新 :某一个事务的回滚, 导致另外一个事务已更新的数据丢失了。

第二类丢失更新 :某一个事务的提交, 导致另外一个事务已更新的数据丢失了。

脏读 :某一个事务, 读取了另外一个事务未提交的数据

不可重复读 :某一个事务, 对同一个数据前后读取的结果不一致

幻读 :某一个事务, 对同一个表前后查询到的行数不一致

• 悲观锁(数据库)

- 共享锁(S锁) 事务A对某数据加了共享锁后,其他事务只能对该数据加共享锁,但不能加排他锁。

 - 排他锁(X锁) 事务A对某数据加了排他锁后,其他事务对该数据既不能加共享锁,也不能加排他锁。

 • 乐观锁(自定义)

 - 版本号、时间戳等 在更新数据前,检查版本号是否发生变化。若变化则取消本次更新,否则就更新数据(版本号+1)。

Spring事务管理 • 声明式事务

- 通过XML配置,声明某方法的事务特征。

 - 通过注解,声明某方法的事务特征。

• 编程式事务 - 通过 TransactionTemplate 管理事务, 并通过它执行数据库的操作

 

案例代码

   // REQUIRED: 支持当前事务(外部事务),如果不存在则创建新事务.
    // REQUIRES_NEW: 创建一个新事务,并且暂停当前事务(外部事务).
    // NESTED: 如果当前存在事务(外部事务),则嵌套在该事务中执行(独立的提交和回滚),否则就会REQUIRED一样.
    @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
    public Object save1() {
        // 新增用户
        User user = new User();
        user.setUsername("alpha");
        user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
        user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
        user.setEmail("alpha@qq.com");
        user.setHeaderUrl("http://image.nowcoder.com/head/99t.png");
        user.setCreateTime(new Date());
        userMapper.insertUser(user);

        // 新增帖子
        DiscussPost post = new DiscussPost();
        post.setUserId(user.getId());
        post.setTitle("Hello");
        post.setContent("新人报道!");
        post.setCreateTime(new Date());
        discussPostMapper.insertDiscussPost(post);

        //这步报错,观测是否回滚
        Integer.valueOf("abc");

        return "ok";
    }

    public Object save2() {
        transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
        transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

        return transactionTemplate.execute(new TransactionCallback<Object>() {
            @Override
            public Object doInTransaction(TransactionStatus status) {
                // 新增用户
                User user = new User();
                user.setUsername("beta");
                user.setSalt(CommunityUtil.generateUUID().substring(0, 5));
                user.setPassword(CommunityUtil.md5("123" + user.getSalt()));
                user.setEmail("beta@qq.com");
                user.setHeaderUrl("http://image.nowcoder.com/head/999t.png");
                user.setCreateTime(new Date());
                userMapper.insertUser(user);

                // 新增帖子
                DiscussPost post = new DiscussPost();
                post.setUserId(user.getId());
                post.setTitle("你好");
                post.setContent("我是新人!");
                post.setCreateTime(new Date());
                discussPostMapper.insertDiscussPost(post);

                //这步报错,观测是否回滚
                Integer.valueOf("abc");

                return "ok";
            }
        });
    }

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

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

相关文章

MySQL使用索引的最佳指南

MySQL使用索引的最佳指南1.选择合适的字段创建索引2.尽可能的考虑建立联合索引而不是单列索引3.注意避免冗余索引4.考虑在字符串类型的字段上使用前缀索引代替普通索引5.索引失效的情况1.选择合适的字段创建索引 不为 NULL 的字段 &#xff1a;索引字段的数据应该尽量不为 NUL…

java面向对象,全是对象,这么多对象2023015

面向对象&#xff08;一遍一遍的领悟&#xff09; Java支持面向对象的三大特征&#xff1a;封装、继承和多态&#xff0c; Java提供 了private、protected和public三个访问控制修饰符来实现良好的封装&#xff0c;提供了extends关键字来让子类继承父类&#xff0c;子类继承父类…

人工智能图像形状检测算法

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…

Redis下载安装与配置(linux)

一、Redis下载与安装 1.下载安装包 官网下载地址&#xff1a;Download | Redis 点击"Download 7.0.7"&#xff0c;即可进行下载。 2.将安装包上传至服务器 2.1将安装包上传至/usr/local目录并解压 cd /usr/local lstar -zxvf redis-7.0.7.tar.gz2.2删除安装包 r…

第二天总结 之 商品类型管理界面的实现 之 添加和修改操作 的实现

添加和修改操作 页面跳转问题 点击修改按钮时 跳转的路径 如下 点击添加按钮时 跳转的路径如下 通过这两张图片 不难发现 跳转的是同一个jsp 但是添加操作 是不带id跳转 而修改操作是带着id跳转 所以在其 跳转的页面add_goods_type.jsp页面中 有一个这样的判断 如果没有id…

Linux常用命令——tmux命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tmux Tmux是一个优秀的终端复用软件&#xff0c;类似GNU Screen&#xff0c;但来自于OpenBSD&#xff0c;采用BSD授权。 补充说明 使用它最直观的好处就是&#xff0c;通过一个终端登录远程主机并运行tmux后&a…

2022年HarmonyOS/OpenHarmony生态观察

一、鸿蒙生态世界快速构建升级中 HarmonyOS鸿蒙2019年正式面世&#xff0c;当时消费者只能在华为的智慧屏上体验&#xff1b;2020年&#xff0c;鸿蒙智联-华为面向智能硬件生态伙伴全新品牌和开放平台发布&#xff1b;2021年&#xff0c;智能手机等多种终端全面搭载HarmonyOS2…

UE4 RenderDoc笔记

1.Meh Viewer&#xff1a;当前DrawCall的Mesh信息&#xff0c;可以查看每个点的输入和输出 可以看到该DrawCall的Mesh顶点数量为510&#xff08;该材质ID的Mesh三角面数&#xff09;170*3&#xff0c;第一个顶点ID为3637 2.Texture Viewer:查看该次事件所调用的输入、输出缓…

【进阶】Spring Boot创建和使用

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、Spring Boot 概述二、Spring Boot优点三、Spring Boot项目创建1. 使用IDEA创建&#xff08;社区版&#xff09;2. 网页版创建&#xff08;了解&#xff09;四、项目目录介绍和运行1. 项目目录介绍2. 输出hello w…

Win10 Hyper-V 固定虚拟机IP地址的方法

Windows10系统Hyper-V中存在着一个名为“Default Switch”的缺省虚拟交换机&#xff0c;其本质上是一块虚拟网卡&#xff0c;其所连接的虚拟网络的类型为"Internal"&#xff08;有关Hyper-V三种网络类型的含义&#xff0c;可参看《Hyper-V三种虚拟网络类型的理解_bol…

“深度学习”学习日记。误差反向传播法--算法实现

2023.1.18 经过学习了计算图、链式法则、加法层、乘法层、激活函数层、Affine层、Softmax层的反向传播的实现。今天来学习反向传播法的算法实现&#xff0c;做一次总结&#xff1b; 实现的思路&#xff08;“学习”的步骤&#xff09;&#xff1a; 一&#xff0c;前提 神经…

4.Java的基础语法

小伙伴们,本篇内容让我们一起来总结学习Java的基础语法吧!&#x1f609; 文章目录一、注释二、关键字三、字面量(也被叫做:常量/字面值常量)四、一些特殊字面量的书写五、变量(1)变量的定义格式:(2)输出打印变量:(3)变量的基本用法:(4)变量的注意事项:(5)变量的练习总结一、注释…

【第二章 Excel数据格式】

Excel数据格式1.Excel数据格式2.更改单元格格式2.1数值型数据的更改2.2文本型数据的更改2.3日期型数据的更改2.4日期型数据、数值型数据->文本型数据1.Excel数据格式 数字、文本和日期是最常用的三种数据格式&#xff0c; 数字一般右对齐&#xff0c;方便观测数据位数&am…

mac ganache安装以及在metamask创建ganache网络和账户导入

在做区块链本地测试时&#xff0c;需要测试网络、测试账户以及测试币&#xff0c;可以使用ganache来启动本地网络以及生成账户进行测试。 一、下载及安装ganache 首先下载ganache&#xff0c; 网址是这个https://trufflesuite.com/ganache/ 下载好后进行安装。 安装好以后使用…

Allegro如何让BUS线以粗线形式显示操作指导

Allegro如何让BUS线以粗线形式显示操作指导 在评估PCB布线的时候,设置好Bus线对于评估非常有帮助,Allegro不仅可以支持设置Bus组,还可以让Bus线以粗线形式显示,如下图 具体操作如下 选择Edit-PropertyFind选择nets

【algorithm】算法基础课---二分查找算法(附笔记 | 建议收藏)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;AcWing算法学习笔记 &#x1f4ac;总结&#xff1a;希望你看完…

几种常用的权重初始化方法

来源&#xff1a;投稿 作者&#xff1a;175 编辑&#xff1a;学姐 在深度学习中&#xff0c;权重的初始值非常重要&#xff0c;权重初始化方法甚至关系到模型能否收敛。本文主要介绍两种权重初始化方法。 为什么需要随机初始值 我们知道&#xff0c;神经网络一般在初始化权重…

【EasyExcel】在Java中操作Excel 完成数据的导入导出

快速入门 引入依赖 构建实体类 数据导出 参数 WriteWorkbook WriteSheet WriteTable 测试 数据导入 测试 EasyExcel是阿里巴巴开源的一个excel处理框架&#xff0c;以使用简单、节省内存著称。EasyExcel能大大减少占用内存的主要原因是在解析Excel时没有将文件数据一…

【Ajax】form表单

一、form表单的基本使用什么是表单表单在网页中主要负责数据采集功能。HTML中的<form>标签&#xff0c;就是用于采集用户输入的信息&#xff0c;并通过<form>标签的提交操作&#xff0c;把采集到的信息提交到服务器端进行处理。2. 表单的组成部分<!-- 表单标签 …

Android 深入系统完全讲解(27)

讲完了这块&#xff0c;我们来说下相机相关的&#xff0c;再说之前一定记得&#xff0c;先要有框架思维&#xff0c;这点一直是我 强调的。 相机是什么&#xff0c;硬件采集数据上来&#xff0c;解析完成&#xff0c;上层绘制&#xff0c;在绘制的时候&#xff0c;同步可以做特…