数据库进阶教学——事务

news2024/11/28 21:53:28

目录

一、事务简介

二、事务操作方式

1、设置事务提交方式

1.1、命令

1.2、示例

2、开启事务

2.1、命令

2.2、示例

三、事务四大特性

四、并发事务问题

五、事务隔离级别

5.1、命令

5.2、示例

5.2.1、脏读

5.2.2、不可重复读

5.2.3、幻读


一、事务简介

  • 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
  • 例如,张三要从银行向李四转1000元,银行需要正确操作3个步骤才能完成转账,如果其中某个步骤出错,则会出现异常,那么就可以把这3个步骤当作是一个事务。
    • 在操作前,开启事务,正确完成所有操作后,才提交事务,否则回滚事务。
    • 回滚事务:把之前临时修改的数据,全部恢复。

二、事务操作方式

  •  新建一个用户数据表。
    • create table account(
          id int auto_increment primary key comment '主键ID',
          name varchar(10) comment '姓名',
          money int comment '余额'
      )comment '账户表';
  • 向用户数据表中插入两条用户数据。
    • insert into account(id, name, money) VALUES (null,'张三',2000),(null,'李四',2000);

1、设置事务提交方式

1.1、命令
  • MySQL的事务提交方式默认是自动的,可以设置为手动提交方式。
    • # 查看事务的提交方式,1为自动,0为手动。
      SELECT @@autocommit ;
      # 设置事务提交方式为手动0
      SET @@autocommit = 0;
  • 提交事务
    • COMMIT;
  • 回滚事务
    • ROLLBACK;
1.2、示例
  • 查看事务提交的方式。
  • 此时为自动提交,将其修改为手动提交。
  • 转账操作总共为三步。
    • # 1、查询张三账户余额
      select * from account where name = '张三';
      # 2、将张三账户余额-1000
      update account set money = money - 1000 where name = '张三';
      # 3、将李四账户余额+1000
      update account set money = money + 1000 where name = '李四';
  •  依次输入上面三条命令执行。
  • 刷新用户表,发现张三和李四的余额并没有任何变化,因为此时事务提交方式已经改为了手动。需要另外执行指令才能完成操作。
  • 提交事务,转账成功。
  • 假设一个操作出错的情况。
    • 在执行第三条操作的时候,报错了,此时就不能将这个事务进行提交,不然会出错。
  • 回滚事务,张三和李四的余额并没有任何变化。

2、开启事务

2.1、命令
  • 开启事务
    • START TRANSACTION;
      或
      BEGIN;
  • 提交事务
    • COMMIT;
  • 回滚事务
    • ROLLBACK;
2.2、示例
  • 先把事务提交方式修改回自动提交。
  • 直接测试异常情况,开启事务,执行下列指令。
    • select * from account where name = '张三';
      update account set money = money - 1000 where name = '张三';
      操作出错。。。
      update account set money = money + 1000 where name = '李四';
    • 此时发生异常,但表中的数据并未发生变化。执行回滚即可恢复。

三、事务四大特性

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(lsolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durabilitv):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

四、并发事务问题

  • 两个事务同时操作数据库时所引发的一些问题。
  • 脏读:一个事务读到另外一个事务还没有提交的数据。
  • 不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读。
  • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了“幻影”。

五、事务隔离级别

隔离级别脏读不可重复读幻读
Read uncommitted
Read committed×
Repeatable Read(默认)××
Serializable×××
  • 【注】事务隔离级别越高,数据越安全,但是性能越低

5.1、命令

  • 查看事务隔离级别
    • SELECT @@TRANSACTION_ISOLATION;
  • 设置事务隔离级别
    • SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE} 
      # session 只针对当前对话端有效
      # global 针对所有对话端有效

5.2、示例

  • 打开两个终端,模拟两个事务同时对数据库进行操作。
5.2.1、脏读
  • 将其中一个终端的事务隔离级别设置为Read uncommitted。
  • 模拟读取脏数据的情况。
    • 此时,左侧第二次读取的数据为脏数据,因为右侧终端的事务并未提交。
  • Read committed可以解决脏读的问题。先将两个终端都rollback。
  • 将其中一个终端的事务隔离级别设置为Read committed。
  • 模拟读取脏数据的情况。
    • 此时,左侧第二次读取的数据并未发生改变。
  • 将右侧终端的事务提交,左侧读取的数据才发生改变。
5.2.2、不可重复读
  • 此时事务隔离级别为Read committed,继续使用两个终端进行下列操作(之前的事务开启了记得关闭)。

    • 左侧两次读取的数据不相同,这就是不可重复读问题。
  • Repeatable Read可以解决不可重复读问题,先将左侧终端commit。
  • 将左侧终端的事务隔离级别设置为Repeatable Read。
  • 重新模拟不可重复读的情况。
    • 此时左侧两次读取的数据相同。
  • 将左侧事务提交后,再次查询才看到数据被修改了。
5.2.3、幻读
  • 此时事务隔离级别为Repeatable Read,继续使用两个终端进行下列操作。
    • 左侧先查询id=3的用户,发现该用户不存在;右侧此时插入id=3的用户,并且提交了事务;左侧此时因为没有查询到id=3的用户而要插入id=3的用户,但发现id=3的用户已经存在。再次查询发现,id=3的用户依旧不存在。此时就出现了幻读的问题。
  • Serializable(串行化)可以解决幻读问题,先将左侧终端commit。
  • 将左侧终端的事务隔离级别设置为Serializable。
  • 重新模拟幻读的情况。
    • 左侧查询发现没有id=4的用户后,右侧想要执行插入操作却并未成功,而是需要等待左侧事务提交后才能进行操作。

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

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

相关文章

亚马逊、美客多卖家测评:如何建立养号团队实现运营化式测评?

大家好,我是跨境电商测评养号7年从事经验的珑哥。养号环境软件开发,深度解决各跨境平台矩阵养号防关联、砍单、F号问题。关注珑哥解决更多跨境养号测评问题。 测评,相信这个词对于大部分跨境卖家来说,想必都不陌生,因…

voronoi diagram(泰森多边形) 应用 - Good Manners

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 voronoi 图求解点击前往 题目链接:https://vjudge.net/problem/URAL-1504 题目大意 有一个桌子,形状是圆形。 桌上放着很多蛋糕&#xff0c…

Python模块psutil:系统进程管理与Selenium效率提升的完美结合

前言 在前面编写一个Selenium的自动化程序时候,发现一个问题。 因笔记本配置较为差,所以每次初始化Selenium的WebDriver都会非常慢,整个等待过程是不友好的。 所以我就想到: 在程序中初始化一个全局的WebDriver对象&#xff0c…

Git Rebase 优化项目历史

在软件开发过程中,版本控制是必不可少的一环。Git作为当前最流行的版本控制系统,为开发者提供了强大的工具来管理和维护代码历史。git rebase是其中一个高级特性,它可以用来重新整理提交历史,使之更加清晰和线性。本文将详细介绍g…

1060 爱丁顿数

一.问题: 英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数” E ,即满足有 E 天骑车超过 E 英里的最大整数 E。据说爱丁顿自己的 E 等于87。 现给定某人 N 天的骑车距离,请你算出对应的爱丁…

【计算机网络笔记】传输层——TCP特点与段结构

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

Springboot JSP项目如何以war、jar方式运行

文章目录 一,序二,样例代码1,代码结构2,完整代码备份 三,准备工作1. pom.xml 引入组件2. application.yml 指定jsp配置 四,war方式运行1. 修改pom.xml文件2. mvn执行打包 五,jar方式运行1. 修改…

深入了解汽车级功率MOSFET NVMFS2D3P04M8LT1G P沟道数据表

汽车级功率MOSFET是一种专门用于汽车电子领域的功率MOSFET。它具有高电压、高电流、高温、高可靠性等特点,能够满足汽车电子领域对功率器件的严格要求。汽车级功率MOSFET广泛应用于汽车电机驱动、泵电机控制、车身控制等方面,能够提高汽车电子系统的效率…

sqlserver字符串拼接

本文主要介绍了sqlserver字符串拼接的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。 1. 概 在SQL语句中经常需要进行字符串拼接,以sqlserver,oracle,mysql三种数据库为例&#…

Flink源码解析四之任务调度和负载均衡

源码概览 jobmanager scheduler:这部分与 Flink 的任务调度有关。 CoLocationConstraint:这是一个约束类,用于确保某些算子的不同子任务在同一个 TaskManager 上运行。这通常用于状态共享或算子链的情况。CoLocationGroup & CoLocationGroupImpl:这些与 CoLocationCon…

10月发布的5篇人工智能论文推荐

JudgeLM: Fine-tuned Large Language Models are Scalable Judges https://arxiv.org/pdf/2310.17631.pdf 由于现有基准和指标的限制,在开放式环境中评估大型语言模型(llm)是一项具有挑战性的任务。为了克服这一挑战,本文引入了微调llm作为可扩展“法官…

解决Couldn‘t find meta-data for provider with authority

今天在复用之前写的安装APK的相关代码时发生了报错&#xff0c;那是因为安卓高版本需要新增FileProvider 新增file_paths <?xml version"1.0" encoding"utf-8"?> <paths xmlns:android"http://schemas.android.com/apk/res/android"…

一文读懂以太坊坎昆升级后 Danksharding 扩容路线

以太坊 EIP-4844 是坎昆升级的核心内容&#xff0c;它引入了一种全新的交易类型&#xff08;blob 携带交易&#xff09;以减少以太坊交易费用。blob 携带交易与常规以太坊交易一样&#xff0c;但有一些额外数据被称为 blob。与当前 calldata 存储交易数据不可变和内存只读相比而…

wordpress如何存储远程附件到fss

管理员登录wordpress ,插件---安装插件--搜索"Hacklog Remote Attachment",进行安装并启用 . 设置中找到 Hacklog远程附件.点击进入选项设置. 按照下图填写fss相关参数.这些信息可以在fss详情中查看.目录路径如果没有请先在fss中创建. 4.设置完毕保存,接下来就…

佳易王桌球室台球厅计时计费电脑收费管理系统软件试用版V18.0下载

佳易王桌球室台球厅计时计费电脑收费管理系统软件试用版V18.0下载 一、佳易王桌球棋牌计时计费软件部分功能简介&#xff1a; 1、计时计费功能 &#xff1a;开台时间和所用的时长直观显示&#xff0c;每3秒即可刷新一次时间。 2、销售商品功能 &#xff1a;商品可以绑定桌子…

天天都能买买买,但双11不凑热闹我浑身难受

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 姝琦、卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间 有人说满足情绪需求是消费主义的一个重要特征&#xff0c;甚至堪称商家的消费升级歪招。 是吗&…

SpringSecurity+JWT+Redis实现前后端分离认证与授权

spring security的简单原理&#xff1a; SpringSecurity有很多很多的拦截器&#xff0c;在执行流程里面主要有两个核心的拦截器 登陆验证拦截器AuthenticationProcessingFilter 资源管理拦截器AbstractSecurityInterceptor 但拦截器里面的实现需要一些组件来实现&#xff0c;…

Windows系统搭建网盘神器filebrowser结合内网穿透实现公网访问

Windows系统搭建网盘神器filebrowser结合内网穿透实现公网访问 文章目录 Windows系统搭建网盘神器filebrowser结合内网穿透实现公网访问前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3…

基于安卓Android的校园快药APP-药店app

项目介绍 本文介绍了校园快药APP软件开发建设的意义和国内外发展现状&#xff0c;然后详细描述了所开发手机APP的可行性分析&#xff0c;并分析了手机APP所要实现的功能。因为校园快药设施较多&#xff0c;而且人口密集&#xff0c;不能更好的管理校园快药&#xff0c;造成需要…

[C++ ]:5.类和对象中(运算符重载补充)+ 类和对象下(初始化列表)

类和对象中&#xff08;运算符重载补充&#xff09; 类和对象下&#xff08;初始化列表&#xff09; 一.运算符重载补充&#xff1a;1.流插入运算符&#xff1a;1.考虑到隐含的参数指针&#xff1a;2.进行优化&#xff01;2-1&#xff1a;解决办法&#xff1a;友元2-2&#xff…