DAY 57 MySQL数据库的事务

news2025/2/27 2:08:56

事务的概念

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

总结:所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

数据库是一个公司的核心资产,关系型数据库是可靠的,就是因为有事务的存在。

事务的ACID特点

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

原子性(保证事务的整体性)

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

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

案例说明:

A给B转帐100元钱的时候只执行了扣款语句,就提交了,此时如果突然断电,A账号已经发生了扣款,B账号却没收到加款,在生活中就会引起纠纷。这种情况就需要事务的原子性来保证事务要么都执行,要么就都不执行

一致性(保证数据的完整性)

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

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

案例说明:

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

隔离性

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

  • 对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。

  • 修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一一个使用相同数据的事务结束之后访问这些数据。

  • 也就是说并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。

事务之间的相互影响

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

(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 禁止禁止禁止
串行读禁止禁止禁止禁止禁止

mysql默认的事务处理级别是repeatable read,而Oracle和SQL Server是read committed

事务隔离级别的作用范围

事务隔离级别的作用范围分为两种:

  • 全局级:对所有的会话有效
  • 会话级:只对当前的会话有效(退出连接后即失效)

查询事务的隔离级别

查询全局事务隔离级别

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

 show global variables like '%isolation%';   #方法一
 ​
 SELECT @@global.tx_isolation;               #方法二
 ​
 注释:
 like:表示模糊查询。
 '%isolation%':表示包含isolation字符串。
 'isolation%':以isolation字符串开头。
 '%isolation':以isolation字符串结尾。

查询会话事务隔离级别:

session variables 指会话变量

 show session variables like '%isolation%';    #方法一
 ​
 SELECT @@session.tx_isolation;                #方法二
 ​
 SELECT @@tx_isolation;                        #方法三

设置事务的隔离级别

设置全局事务隔离级别

全局级别设置之后,当前会话需要退出重新进入才会生效

 set global transaction isolation level 隔离级别;  #永久生效
 ​
 示例:
 set global transaction isolation level read committed;  #将全局事务隔离级别设置为提交读(RC)

设置会话事务隔离级别:

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

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

 set session transaction isolation level 隔离级别;
 ​
 示例:
 set session transaction isolation level read committed;  #将会话事务隔离级别设置为提交读(RC)

持久性

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

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

总结:在事务管理中,原子性是基础,隔离性是手段,一致性是目的,持久性是结果

事务控制语句

  • BEGIN 或 START TRANSACTION: 显式地开启一个事务。

  • COMMIT 或 COMMITWORK: 提交事务,并使已对数据库进行的所有修改变为永久性的。

  • ROLLBACK 或 ROLLBACK WORK: 回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。

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

  • ROLLBACK TO [SAVEPOINT] S1: 把事务回滚到标记点

测试begin和commit(开始事务和提交事务)

先创建一个表

mysql> use cxk
mysql> create table account (id int,name char(10),money double);
mysql> insert into account values(1, 'my', 1000);  
mysql> insert into account values(2, 'qyd', 2000);
mysql> select * from account;

 

测试事务未提交的回滚

 测试创建回滚点并进行回滚

 使用 set 设置控制事务

在mysql中执行单独的命令会立即生效,是因为Mysql默认开启自动提交

使用 set 设置控制事务:

set AUTOCOMMIT=0;       #禁止自动提交(仅针对当前会话)
set AUTOCOMMIT=1;       #开启自动提交(仅针对当前会话),Mysql默认为1
show variables like 'AUTOCOMMIT';   #查看当前会话的AUTOCOMMIT值

如果没有开启自动提交,当前会话连接的mysql的所有操作都会当成一个事务直到你输入roollback或者commi当前事务才算结束。当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果。
如果开起了自动提交,mysql 会把每个sql 语句当成一个事务,然后自动的commit。
当然无论开启与否,begin,commit,rollback都是独立的事务

 自动提交关闭

自动提交开启

​​​​​​​

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

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

相关文章

Python突破JS加密限制,进行逆向解密

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 目录标题 前言开发环境:模块使用:逆向目标逆向过程参数 JS 加密关键代码Python 登录关键代码尾语 💝 开发环境: Python 3.8 Pycharm 模块使用: time >>> 时间模块,属于内置,无…

lol由于找不到vcruntine140_1.dll文件,vcruntime140_1.dll修复方法

家人们有没有遇到过打开游戏或者软件提示由于找不到vcruntime140_1.dll,无法继续执行此代码的情况,是不是不知道怎么修复呢?Vcruntime140_1.dll是一个Windows系统文件,它是Microsoft Visual C Redistributable for Visual Studio …

快速搭建测ceph

一、cephadm介绍 Cephadm是一个由Ceph社区维护的工具,它用于在Ceph集群中管理和部署Ceph服务。它是一个基于容器化的工具,使用了容器技术来部署Ceph集群的不同组件。 使用Cephadm,管理员可以通过简单的命令行界面在整个Ceph集群中进行自动化…

Python递归树结构,回溯法深度优先、广度优先详解,代码实现

Python实现,递归算法,深度优先、广度优先 其实递归说白了就是循环本身函数,只不过下次循环的输入值是上次循环的结果值。关于递归算法,我经常把它用在搜索、计算中。我们来看一个简单的例子: 计算Demo 要实现1&…

高数杂项1

一些口诀 长杠变短杠,开口换方向 其实意思是底下这个 C ∩ D ‾ C ‾ ∪ D ‾ \overline{C \cap D} \overline C \cup \overline D C∩DC∪D 可导必可微,可微必可导 二者互为充要条件 可导必定连续,连续未必可导。连续必定可积,可微未必可积…

django-restful-framework基础知识

DRF 总体设计框架流程 DRF大体的工作流程如下图: 其中:这里的Request不再是Django默认的HttpRequest对象,而是REST Framework提供的扩展了HttpRequest类的Request类对象。 1. Web应用模式 在开发Web应用中,有两种应用模式&…

【sentinel】授权规则详解及源码分析

之前我们在配置流控规则时,可以根据origin参数来对调用方进行限流。 很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用Sentinel的黑白名单控制的功能,这就是授权规则。 黑白名单也是根据资源的请求来源&#xff0…

vite跨域问题,你可能需要看这篇文章

最近在学习项目的时候,使用了vite工具进行构建,然后出现了跨域的问题,中间的曲折不过多叙述,直接进入正题。 前端成功启动后的界面: 然后在后端进行的Controller上使用了如下的配置 然后浏览器就会出现跨域的问题 为什…

Maven 依赖管理 学习

目录 Maven 依赖管理 可传递性依赖发现 依赖范围 依赖管理 Maven 自动化部署 问题描述 解决方案 修改项目的 pom.xml Maven Release 插件 Maven Web 应用 创建 Web 应用 构建 Web 应用 部署 Web 应用 Maven 依赖管理 Maven 一个核心的特性就是依赖管理。当我们处…

【场景生成与研究】考虑时序相关性MC的场景生成与削减研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Docker基础篇(下)

1、容器命令 新建启动容器 docker run [OPTIONS] IMAGE [COMMAND] [ARG...]常用的参数: ● --name:为容器指定一个名称 ● -d:后台运行容器并返回容器ID,也即启动守护式容器 ● -i:以交互模式(interacti…

基于FPGA:运动目标检测(LCD显示+串口输出,纯Verilog工程)

目录 前言一、先看效果二、硬件选择三、系统框架四、程序模块1、系统顶层模块2、图像处理顶层模块3、LCD驱动顶层模块4、SDRAM控制器顶层模块5、上位机发送模块 五、工程及套件获取1、工程获取2、套件 前言 最早做了基于FPGA:运动目标检测(VGA显示&#…

Java基础-面向对象总结(1)

本文主要梳理关于 Java面向对象的基础知识,希望对你有帮助 Java对象 目录 Java对象 Java创建对象有几种方式 创建一个对象用什么运算符? 对象实体与对象引用有何不同? 创建一个对象的步骤 Java对象都包含什么 ? new Object()对象占多少个字节? 对象的比较 对象的相…

kafka原理之生产者

batch.size:只有数据累计到batch.size后,sender才会发送数据。默认16k linger.ms:如果迟迟没有达到batch.size,sender等待linger.ms设置时间之后,发送数据。单位:ms,默认0(没有延迟) acks设置: 0:不需要等待数据落盘应答;1:leader…

Java ---多线程(下)

(一)目录 线程的优先级 守护线程 线程同步 线程并发协作 主要内容 (二)线程的优先级 1 什么是线程的优先级 每一个线程都是有优先级的,我们可以为每个线程定义线程的优先级,但是这并不能保 证高优…

Anaconda下载与安装详解

文章目录 1 Anaconda1.1 简介1.2 下载安装1.3 配置环境变量1.4 下载配置1.4.1 conda配置1.4.1.1 修改conda下载源1.4.1.2 删除下载源1.4.1.3 包下载目录1.4.1.4 下载报错 1.4.2 pip配置1.4.2.1 配置源1.4.2.2 下载目录1.4.2.3 修改下载目录 1.5 修改虚拟环境地址1.5.1 通过配置…

【软件开发】Memcached(理论篇)

Memcached(理论篇) 1.Memcached 简介 Memcached 是一个开源的,支持高性能,高并发的分布式内存缓存系统,由 C 语言编写,总共 2000 多行代码。从软件名称上看,前 3 个字符 Mem 就是内存的意思&am…

quartz原理

1.如何实现任务 2.3个组件 3.工作原理 在Quartz中,有两类线程,Scheduler调度线程和任务执行线程,其中任务执行线程通常使用一个线程池维护一组线程。 Scheduler调度线程主要有两个:执行常规调度的线程,和执行misfir…

【C++】关联式容器——mapset的使用

文章目录 1.关联式容器和键值对1. 关联式容器2. 键值对 2. 树形结构的关联式容器——set1. 模版参数列表2. 默认成员函数3. 迭代器4.容量相关操作5.modify6.其他操作接口 3. 树形结构的关联式容器——map1. 默认成员函数2. 迭代器3. 容量与数据访问4.数据修改5. 其他操作接口 1…

vue-5:router

router路由配置,使用 在vue-cli构建的vue单页面应用中,需要借助vue-router库实现路由功能 配置路由 (构建项目时要下载) router文件夹下创建:index.js,routerConfig.js配置路由 路由懒加载: 按需加载:…