MySQL 事务

目录

一、事务的概念 

二、事务的ACID特点

1)事务的原子性

2)事务的一致性

3)事务的隔离性

(1)脏读 

(2)不可重复读

(3)幻读

(4) 丢失更新

事务的隔离级别

(1)未提交读(Read Uncommitted(RU)):

(2)提交读(Read Committed (RC)): 

(3)可重复读(Repeatable Read(RR)):——mysql默认的隔离级别

(4)串行读(serializable):——相当于锁表

4)持久性

三、事务级别的查看与设置

1)全局变量事务级别的查询

方法一:模糊查询显示

方式二:select语句查询 

2)variables变量事务级别查询

 3)设置事务的隔离级别

 (1)设置全局事务隔离级别

(2)设置会话事务隔离级别 

临时设置:

四、事务控制语句

1)最简单事务的流程操作  

(1)开始事务而不提交事务

(2)开始事务并提交事务  

 3)提交读的隔离级别防止脏读

(1)未提交事务的两台同连接显示 

(2)提交事务后,两台同连接数据表显示

4)重复读(rr)的隔离级别的作用演示

(1)未提交事务,同连接数据表 

(2)提交后同连接的数据表  

5)回滚事务的设置演示 

(1)默认回滚 

(2)根据设置的标记点进行回滚

五、SQL语句的事务设置 

1)自动提交开启的演示 

2)关闭自动提交事务后的 sql语句 

总结

事务的ACID特性:

原子性(Atomicity)

一致性(Consistency )

隔离性(Isolation)

持久性(Durability)

事务之间的相互影响

事务的隔离级别:

查询全局事务隔离级别:

查询会话事务隔离级别:

设置全局事务隔离级别:

设置会话事务隔离级别:

事务控制语句:

使用 set 设置控制事务:


一、事务的概念 

  • 事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个 整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
  • 事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
  • 事务适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
  • 事务通过事务的整体性以保证数据的一致性
  • 事务能够提高在向表中更新和插入信息期间的可靠性

总的来说,事务 就是一种机制,包含了一组操作命令,会作为一个不可分割的整体,要么都执行,要么都不执行 ,它保证了数据库的安全可靠性

二、事务的ACID特点

ACID,是指在可靠数据库管理系统(DBMS) 中,事务(transaction)应该具有的四个特性:原子性(Atomicity) 、一致性(Consistency )、隔离性(Isolation) 、持久性(Durability) 。这是可靠数据库所应具备的几个特性

1)事务的原子性

原子性的最大作用就是保证事务的整体性,避免外界因素对原本数据更改执行的影响 

原子性:事务是一个不可再分割的工作单位,事务中的操作要么都发生,要么都不发生

  • 事务是一个完整的操作,事务的各元素是不可分的
  • 事务中的所有元素必须作为一个整体提交或回滚
  • 如果事务中的任何元素失败,则整个事务将失败

eg: 比如在银行中进行转账,这边已经转款成功,结果此时因外界因素中断,对方的余额并未增加,而自己的账户扣款,就属于重大的数据事故。所以必须保证转帐的整个过程是一体的,要么转账成功,按预计发生变化。要么转账失败,双方余额保持不变

2)事务的一致性

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

  • 当事务完成时,数据必须处于一致状态 
  • 在事务开始前,数据库中存储的数据处于一致状态
  • 在正在进行的事务中,数据可能处于不一致的状态
  • 当事务成功完成时,数据必须再次回到已知的一致状态

eg:对银行转帐事务,不管事务成功还是失败,应该保证事务结束后表中A和B的存款总额跟事务执行前一致。例如,A的账户有1000元,B的账户有1000元,现在A转账200元给B,不管事务成功还是失败,转账前后A和B的存款总额都应该是2000元。 

3)事务的隔离性

隔离性:指在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间

  • 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
  • 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一一个使用相同数据的事务结束之后访问这些数据
  • 也就是说并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的

当多个用户进行同时操作, 如果不存在隔离性的事务,就会出现以下状况:

(1)脏读 

 当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据然后使用了这个数据

(2)不可重复读

指在一个事务内,多次读同一数据。 在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一一个事务内两次读到的数据是不一样的,因此称为是不可重复读。( 即不能读到相同的数据内容)

3)幻读

一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,另一个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。 那么,操作前一个 事务的用户会发现表中还有没有修改的数据行,就好象发生了幻觉一样 

(4) 丢失更新

两个事务同时读取同一条记录,A先修改记录,B也修改记录(B不知道A修改过),B提交数据后B的修改结果覆盖了A的修改结果

事务的隔离级别

事务的隔离级别决定了事务之间可见的级别

MySQL事务支持如下四种隔离,用以控制事务所做的修改,并将修改通告至其它并发的事务:

(1)未提交读(Read Uncommitted(RU)):

允许脏读,即允许一个事务可以看到其他事务未提交的修改

(2)提交读(Read Committed (RC)): 

允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。防止脏读

(3)可重复读(Repeatable Read(RR)):——mysql默认的隔离级别

确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。可以防止脏读和不可重复读

(4)串行读(serializable):——相当于锁表

完全串行化的读,将一个事务与其他事务完全地隔离。每次读都需要获得表级共享锁,读写相互都会阻塞。可以防止脏读,不可重复读取和幻读,(事务串行化)会降低数据库的执行效率

隔离级别脏读取不可重复读幻像读
未提交读允许允许允许
已提交读禁止允许允许
可重复读禁止禁止对 InnoDB 禁止
串行读禁止禁止禁止

4)持久性

持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚

  • 指不管系统是否发生故障,事务处理的结果都是永久的
  • 一旦事务被提交,事务的效果会被永久地保留在数据库中

三、事务级别的查看与设置

variables 指变量, global variables 指全局变量

1)全局变量事务级别的查询

方法一:模糊查询显示

show global variables like '%isolation%'; 

注释:
 like:表示模糊查询
 '%isolation%':表示包含isolation字符串
 'isolation%':以isolation字符串开头
 '%isolation':以isolation字符串结尾

方式二:select语句查询 

 SELECT @@global.tx_isolation;               ​

2)variables变量事务级别查询

session variables 指会话变量

 show session variables like '%isolation%';    #方法一

 SELECT @@session.tx_isolation;                #方法二

 SELECT @@tx_isolation;                        #方法三

 3)设置事务的隔离级别

 (1)设置全局事务隔离级别

 set global transaction isolation level 隔离级别;

可设置的级别有:

  • 未提交读(Read Uncommitted(RU))
  • 提交读(Read Committed (RC))
  • 可重复读(Repeatable Read(RR))
  • 串行读(serializable):——相当于锁表

临时设置: 

set @@global.tx_isolation='隔离级别';   #重启mysql服务后失效,必须使用大写,如READ-COMMITTED​
set global tx_isolation='隔离级别';    #重启mysql服务后失效,必须使用大写,如REPEATABLE-READ

(2)设置会话事务隔离级别 

会话事务隔离级别只对当前连接有效,退出连接后失效。在其他终端连接无效

再次连接后会恢复为全局事务的隔离级别

set session transaction isolation level 隔离级别;

临时设置:

 set @@session.tx_isolation='隔离级别';   #退出连接后失效,必须使用大写,如READ-COMMITTED​set session tx_isolation='隔离级别';     #退出连接后失效,必须使用大写,如READ-COMMITTED

四、事务控制语句

  • BEGIN 或 START TRANSACTION: 显式地开启一个事务
  • COMMIT 或 COMMITWORK: 提交事务,并使已对数据库进行的所有修改变为永久性的
  • ROLLBACK 或 ROLLBACK WORK: 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改
  • SAVEPOINT S1: 使用SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个SAVEPOINT;“S1”代表回滚点名称
  • ROLLBACK TO [SAVEPOINT] S1: 把事务回滚到标记点

为以下操作提前准备一个简单的数据表:

 create table  if not exists cost(id int(4),name char(5),rmb double );

1)最简单事务的流程操作  

一个事务的完整完成的过程中:只要有一个begin(事务起始标志)和commit(事务提交)

(1)开始事务而不提交事务

(2)开始事务并提交事务  

将全局变量和variables的隔离级别设置为 未提交读

 脏读演示(开启多连接mysql,模拟两个同时进行的操作):

 3)提交读的隔离级别防止脏读

(1)未提交事务的两台同连接显示 

 事务A(第一个连接): 

事务B(第二个连接): 

(2)提交事务后,两台同连接数据表显示

事务A(第一个连接):

事务B(第二个连接):

4)重复读(rr)的隔离级别的作用演示

测试前准备:

(1)未提交事务,同连接数据表 

事务A(第一个连接): 

事务B(第二个连接): 

(2)提交后同连接的数据表  

事务A:

事务B: 

5)回滚事务的设置演示 

(1)默认回滚 

(2)根据设置的标记点进行回滚

  • SAVEPOINT S1: 使用SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个SAVEPOINT;“S1”代表回滚点名称。
  • ROLLBACK TO [SAVEPOINT] S1: 把事务回滚到标记点。

节点保存操作: 

指定的事务回滚操作: 

五、SQL语句的事务设置 

默认情况下,每一个sql语句就是一个事务,即一条语句的执行,就完成了一个事务。(默认情况下数据的设置是自动提交事务) 

show variables like 'autocommit';show variables like 'AUTOCOMMIT';   #查看当前会话的AUTOCOMMIT值show global variables like 'AUTOCOMMIT';  #查看全局事务的AUTOCOMMIT值

1)自动提交开启的演示 

 set AUTOCOMMIT=1;       #开启自动提交(仅针对当前会话),Mysql默认为1
set global AUTOCOMMIT=1;    #开启自动提交(针对全局事务),Mysql默认为1

2)关闭自动提交事务后的 sql语句 

 set AUTOCOMMIT=0;       #禁止自动提交(仅针对当前会话)set global AUTOCOMMIT=0;    #关闭自动提交(针对全局事务),Mysql默认为1

总结

事务的ACID特性:

  • 原子性(Atomicity)

  • 一致性(Consistency )

  • 隔离性(Isolation)

  • 持久性(Durability)

这是可靠数据库所应具备的几个特性

事务之间的相互影响

当多个客户端并发地访问同一个表时,可能出现下面的一致性问题:

  • 脏读
  • 不可重复读
  • 幻读
  • 丢失更新

事务的隔离级别:

  1. 未提交读(Read Uncommitted(RU)) :允许脏读
  2. 提交读(Read Committed (RC)) :防止脏读
  3. 可重复读(Repeatable Read(RR)):—mysql默认的隔离级别,防止脏读和不可重复读
  4. 串行读(serializable):—相当于锁表,可以防止脏读、不可重复读和幻读,(事务串行化)会降低数据库的执行效率

查询全局事务隔离级别:

  • show global variables like '%isolation%';
  • select @@global.tx_isolation;

查询会话事务隔离级别:

  • show session variables like '%isolation%';
  • select @@session.tx_isolation;
  • select @@tx_isolation;

设置全局事务隔离级别:

  • set global transaction isolation level 隔离级别; #永久生效
  • 示例: set global transaction isolation level read committed;

设置会话事务隔离级别:

  • set session transaction isolation level 隔离级别; #退出连接后失效
  • 示例:set session transaction isolation level read committed;

事务控制语句:

  • BEGIN 或 START TRANSACTION: 显式地开启一个事务
  • COMMIT 或 COMMITWORK: 提交事务,并使已对数据库进行的所有修改变为永久性的
  • ROLLBACK 或 ROLLBACK WORK: 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改
  • SAVEPOINT S1: 使用SAVEPOINT 允许在事务中创建一个回滚点,一个事务中可以有多个SAVEPOINT;“S1”代表回滚点名称
  • ROLLBACK TO [SAVEPOINT] S1: 把事务回滚到标记点

使用 set 设置控制事务:

set autocommit=0; #禁止自动提交(仅针对当前会话)

set autocommit=1; #开启自动提交(仅针对当前会话),Mysql默认为1

set global autocommit=0; #禁止自动提交(针对全局事务)

set global autocommit=1; #开启自动提交(针对全局事务),Mysql默认为1

show variables like 'autocommit';   #查看当前会话的autocommit值

show global variables like 'autocommit';    #查看全局事务的autocommit值

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

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

相关文章

测试开发之前端篇-Web前端简介

自从九十年代初,人类创造出网页和浏览器后,Web取得了长足的发展,如今越来越多的企业级应用也选择使用Web技术来构建。 前面给大家介绍网络协议时讲到,您在阅读这篇文章时,浏览器是通过HTTP/HTTPS协议向服务器发送请求…

MyBatisPlus

一、MyBatis-Plus 1、简介 [MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 我们的愿景是成为 MyBatis 最好的搭档,就像魂斗罗中的 1P、2P&#…

探索ES高可用:滴滴自研跨数据中心复制技术详解

Elasticsearch 是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎,其每个字段均可被索引,且能够横向扩展至数以百计的服务器存储以及处理TB级的数据,其可以在极短的时间内存储、搜索和分析大量的数据。 滴滴ES发展至今&#xf…

Telink泰凌微TLSR8258蓝牙开发笔记(一)

一、开发环境搭建 1.1、软件开发环境: 1.1.1、开发的IDE: IDE下载链接 1.1.2、烧录工具 DBT下载地址 1.1.3、蓝牙SDK 蓝牙SDK下载地址 1.2、硬件开发环境 8258开发板烧录工具一套 二、运行例程,并使能打印调试信息功能 File-->Impo…

状态模式(C++)

定义 允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。 应用场景 在软件构建过程中,某些对象的状态如果改变,其行为也会随之,而发生变化,比如文档处于只读状态,其支持的行为和读写…

仅使用 CSS 创建打字机动画效果

创建打字机效果比您想象的要容易。虽然实现这种效果的最常见方法是使用 JavaScript,但我们也可以使用纯 CSS 来创建我们的打字机动画。 在本文中,我们将了解如何仅使用 CSS 创建打字机动画效果。它简单、漂亮、容易。我们还将看看使用 CSS 与 JavaScrip…

全球互联网步入IPv6时代,IPv4逐渐告别历史舞台

随着互联网技术的飞速发展,全球互联网正迎来IPv6与IPv4并存转型阶段。IPv6, 新一代互联网协议,以其更大的地址空间和更高的效率正逐渐取代IPv4成为互联网的主导。 全球互联网开始全面实施IPv6这意味着IPv4时代正在逐渐走向尾声。IPv4与IPv6为互联网协议版…

【Spring Boot】了解Spring Boot 的日志文件

目录 一、日志的作用 二、日志文件的简单使用 1、Spring Boot中的默认日志 2、自定义日志打印 三、日志级别 1、日志级别分类 2、日志级别的设置 3、日志持久化 四、基于LomBok的日志输出 1、安装Lombok插件 2、使用Lombok添加日志 3、使用Lombok添加getter和setter…

SAM 大模型Colab快速上手【Segment Anything Model】

Google Colab 是一个基于云的 Jupyter 笔记本环境,允许您通过浏览器编写、运行和共享 Python 代码。 它就像 Google 文档,但用于代码。 通过免费版本的 Google Colab,你可以获得带有约 16GPU VRAM 的 Nvidia Tesla T4 GPU,这对于…

解决K8S集群设置污点后,污点不生效,下发应用的问题

问题:在集群中部署了三个daemonset,一开始加了容忍Toleration,后边去掉Toleration后,还是一直往边缘节点上部署应用,非常离谱 解决:删掉Toleration后,需要把annotations一起删掉,因为…

区块链媒体发稿:区块链媒体宣发常见问题解析

据统计,由于区块链应用和虚拟货币的兴起,越来越多媒体对区块链领域开展报导,特别是世界各国媒体宣发全是热火朝天。但是,随着推卸责任媒体宣发的五花八门,让很多人因而上当受骗,乃至伤害一大笔资产。身为投…

打破雇佣思想 云畅科技CIO曾颖博士浅析零雇工模式

作者简介 INTRO 曾 颖 工商管理博士 云畅科技高级合伙人、CIO 产业咨询&企业数字化转型落地专家 2018年,“零雇工”企业组织创新2018全球创新创业教育高峰论坛在西安举行,我当时作为上海沐新众创空间的导师和分会场“企业家如何创建零雇工…

6.pip简介,第三方库的安装

引言 使用过Visual Studio的小伙伴可能对npm不陌生,没错,pip与npm的功能是一样的。 首先要知道,Python这门语言拥有着丰富的标准库以及先辈们开发的各种功能强大的第三方库。而今天我们主要学习的呢就是关于Python中的包管理工具。它是Pytho…

模仿火星科技 基于cesium+ 贴地测量+可编辑

当您进入Cesium的编辑贴地测量世界,下面是一个详细的操作过程,帮助您顺利使用这些功能: 1. 创建提示窗: 启动Cesium应用,地图场景将打开,欢迎您进入编辑模式。在屏幕的一角,一个友好的提示窗将…

Java基础入门篇——While循环(十二)

目录 一、循环结构语句 二、while循环语句 三、do-while循环语句 四、break使用 一、循环结构语句 在实际生活中经常会将同一件事情重复做很多次。例如,在做眼保健操的第四节轮刮眼眶时,会重复刮眼眶的动作:打乒乓球时,会重复…

车云一体化系统基础理论

车云一体化系统基础理论 介绍目标正文 参考文档 介绍 最近在调研车云链路一体化的整套解决方案,涉及分布式消息队列(RocketMQ)、分布式存储(Doris)、离线数据处理(Spark)、用户行为日志分析&am…

vuejs 设计与实现 - 双端diff算法

我们介绍了简单 Diff 算法的实现原理。简单 Diff 算法利用虚拟节点的 key 属性,尽可能地复用 DOM元素,并通过移动 DOM的方式来完成更新,从而减少不断地创建和销毁 DOM 元素带来的性能开销。但是,简单 Diff 算法仍然存在很多缺陷&a…

告别传统人肉运维,实现360°可观测!奇点云数据存算引擎DataKun R2.0发布

近日,奇点云的数据云全系产品发布新一季更新。本文着重分享数据存算引擎DataKun、数据安全引擎DataBlack、指标工厂SimbaMetric、标签工厂SimbaTag的最新进展。 摘要: 数据存算引擎DataKun R2.0发布,在安全稳定、智能运维、自主可控等层面均…

深入理解Jdk5引入的Java泛型:类型安全与灵活性并存

深入理解Jdk5引入的Java泛型:类型安全与灵活性并存 ​ 在Java的中,有一个强大的工具,它可以让你在编写代码时既保持类型安全,又享受灵活性。**这个工具就是——泛型(Generics)。**本文将引导你深入了解Java…

袋鼠云数栈 DataOps 数据生产力实践,实现数据流程的自动化和规范化

袋鼠云产品团队在帮助企业进行数字化转型实践的过程中,发现很多企业在数据生产链路上都有着相同的问题。包括数据团队聚焦于业务需求短期内的快速交付,内部缺少自顶向下的数据生产管理制度,在数据标准、数据生产流程到研发规范的各个层面均存…