Mysql数据库:事务管理

news2024/9/27 22:54:03

目录

一、Mysql事务的概述

1、Mysql事务的概念

2、事务的ACID四大特性

3、事务之间的相互影响

4、事务的四种隔离级别

5、MySQL与Oracle自动提交事务的区别

6、事务隔离级别的作用范围

二、Mysql事务相关操作

1、查询和设置事务隔离级别

1.1 全局级事务隔离级别

1.1.1 查询

1.1.2 设置

1.2 会话级事务隔离级别

1.2.1 查询

1.2.2 设置

2、设置控制事务

3、事务控制语句

3.1 提交事务

3.2 回滚事务

3.3 多点回滚

三、总结

1、事务的ACID特性

2、事务的隔离级别


一、Mysql事务的概述

1、Mysql事务的概念

 MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中, 要删除一个人员,即需要删除人员的基本资料,又需要删除和该人员相关的信息,如信箱、文章等等。这样,这些数据库操作语句就构成一个事务

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

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

2、事务的ACID四大特性

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

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

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

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

  • 一致性:事务在执行前后,数据库都必须保持一致性状态。这意味着事务执行前后,数据库的完整性约束没有被破坏

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

案例:
对银行转帐事务,不管事务成功还是失败,应该保证事务结束后表中A和B的存款总额跟事务执行前一致

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

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

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

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

3、事务之间的相互影响

原则上一个事务的执行不能被其他事务干扰,事务之间的相互影响主要体现在隔离性上,这种相互影响可能导致以下几种问题:

  • 脏读(Dirty Reads):一个事务读取到另一个事务未提交的数据。未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。如果这些数据最终被回滚,那么第一个事务读取的数据就是不一致的

  • 不可重复读(Non-Repeatable Reads):在同一个事务中,多次读取同一数据集合时,由于其他事务的提交,导致后续读取的数据和前面的不一致

  • 幻读(Phantom Reads):在同一个事务中,两次执行相同的查询,由于其他事务插入或删除了数据,导致第二次查询的结果集中出现了额外的“幻影”数据

  • 丢失更新(Lost Updates):当两个或多个事务读取同一数据,并基于读取的值更新它时,其中一个事务的修改可能会被其他事务的修改所覆盖。

4、事务的四种隔离级别

  • 读未提交(read uncommitted):最低的隔离级别,允许读取未提交的数据,即使未提交,本事务也可能读取到其他会话中未提交事务修改的数居。可能会导致脏读、不可重复读和幻读

       安全性最差,但性能最好 (一般不使用)

  • 读已提交(read committed):允许从已经提交的事务中读取数据。这可以避免脏读,但不可重复读和幻读仍然可能发生,Oracle等多数数据库默认都是该级别

       安全性较差,性能较好(oracle 数据库默认)

  • 可重复读(repeatable read):保证在同一个事务中多次读取同一数据的结果是一致的,避免了脏读和不可重复读,是MySQL的默认隔离级别。但在某些情况下,幻读仍然可能发生

       安全性较高,性能较差 (mysql 数据库默认)

  • 串行化(serializable):最高的隔离级别,通过强制事务串行执行,每次读都需要获得表级共享锁,读写相互都会阻塞,避免了脏读、不可重复读和幻读,但可能会导致大量的超时和锁争用问题

       安全性高,性能差(一般不使用)

5、MySQL与Oracle自动提交事务的区别

MySQL数据库和Oracle数据库在处理自动提交事务方面有一些基本的区别,这些区别主要源于它们对事务管理的默认行为和配置选项的不同

MySQL的自动提交

  • 默认行为:MySQL默认启用自动提交模式。这意味着每个单独的SQL语句都被视为一个事务,除非明确地开始一个事务(使用start transactionbegin语句)。在执行语句后,事务会立即被提交,结果被永久保存
  • 配置:可以通过设置autocommit变量来更改这个行为。设置SET autocommit=0;会禁用自动提交,直到你显式地提交事务(使用commit语句)或回滚事务(使用rollback语句)

Oracle的自动提交

  • 默认行为:Oracle数据库默认不启用自动提交。在Oracle中,事务会一直保持开启状态,直到你显式地提交(使用commit语句)或回滚(使用rollback语句)。这意味着你可以执行多个SQL语句作为同一个事务的一部分,而不是每个语句都作为一个单独的事务
  • 配置:虽然Oracle默认不使用自动提交,但客户端工具和应用程序可以设置自动提交。例如,在SQL*Plus中,可以使用set autocommit on命令来启用自动提交。此外,许多数据库连接池和ORM工具也允许配置自动提交行为

6、事务隔离级别的作用范围

MySQL数据库中,事务隔离级别可以在全局级别和会话级别进行设置,这两者的主要区别在于设置的作用范围和持久性

全局级别(Global Level)

  • 作用范围:全局级别的设置会影响到整个数据库系统中所有新建立的会话和事务。这意味着,一旦全局级别的事务隔离级别被设置,它会应用于之后所有新启动的会话,除非在会话级别进行了覆盖
  • 持久性:全局级别的设置通常在数据库的配置文件中进行,或者通过管理员会话临时设置。如果是通过配置文件设置,更改是持久的,会在数据库重启后仍然有效。如果是在会话中通过SQL命令设置,那么重启数据库后,这些设置会丢失,除非再次进行设置

会话级别(Session Level) 

  • 作用范围:会话级别的设置仅影响到当前会话中的事务。这意味着,对事务隔离级别的更改只会影响到当前的数据库连接和通过该连接执行的事务,对其他会话和事务没有影响
  • 持久性:会话级别的设置仅在当前会话中有效,一旦会话结束,设置就会失效。下一次会话不会继承上一次会话的设置,除非再次进行设置 

二、Mysql事务相关操作

1、查询和设置事务隔离级别

1.1 全局级事务隔离级别

1.1.1 查询
方法一:show global variables like '%isolation%';
方法二:select @@global.tx_isolation;

1.1.2 设置
set global transaction isolation level 事务隔离级别;
#事务隔离级别有四种,分别为读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)、串行化(serializable)
set global transaction isolation level read committed;
#将全局事务隔离级别设置为读已提交(read committed)

注:

设置全局隔离级别会影响新建立的会话的默认隔离级别,但不会立即改变已经存在的会话的隔离级别 

1.2 会话级事务隔离级别

1.2.1 查询
方法一:show session variables like '%isolation%';
方法二:select @@session.tx_isolation; 
方法三:select @@tx_isolation;

1.2.2 设置
set session transaction isolation level 事务隔离级别;
#事务隔离级别有四种,分别为读未提交(read uncommitted)、读已提交(read committed)、可重复读(repeatable read)、串行化(serializable)
set session transaction isolation level read committed;
#将会话级事务隔离级别设置为读已提交(read committed)

2、设置控制事务

自动提交是指每个SQL语句是否立即执行并且立即提交到数据库。当自动提交开启时,每个单独的SQL语句都会被立即执行并提交到数据库,而当自动提交关闭时,需要使用显式提交命令将一系列SQL语句的执行结果提交到数据库

set autocommit=0;						
#禁止自动提交
set autocommit=1;						
#开启自动提交,Mysql默认为1
show variables like 'autocommit';		
#查看Mysql中的autocommit值

如果开起自动提交,mysql会把每个sql语句当成一个事务,然后自动的commit,不需要显式地调用提交命令

如果关闭自动提交,当前会话连接的mysql的所有操作都会当成一个事务,直到你输入rollback|commit;当前事务才算结束,当前事务结束前新的mysql连接时无法读取到任何当前会话的操作结果

3、事务控制语句

前提:先新建一个表,然后插入一些数据

create table test(id int(3) primary key not null,name varchar(20),money double);
insert into test values(1,'dhx',1000); 
insert into test values(2,'ytc',1000);
select * from test;

3.1 提交事务

使用begin开始事务,而后开始处理、修改数据,最后使用commit提交事务,算一次完整的事务,则在事务中的所有操作生效,否则不生效

begin; 或 start transaction;
#显式地开启一个事务
commit; 或 commit work;
#提交事务,并使已对数据库进行的所有修改变为永久性的
begin;
update test set money = money - 200 where id=1;
commit;

3.2 回滚事务

使用rollback指令回滚未提交的事务,使数据回到事务开始前的状态

rollback; 或 rollback work;
#回滚会结束用户的事务,并撤销正在进行的所有未提交的修改
begin;
update test set money = money - 300 where id = 1;
select * from test;
rollback;

3.3 多点回滚

允许在一个长事务中标记多个回滚点,从而在需要时只回滚到某个特定点,而不是全部撤销事务中的所有操作。在长事务中,如果某个部分失败,无需回滚整个事务,只需回滚到最近的保存点,减少了不必要的重做工作

savepoint S1;
#允许在事务中创建一个回滚点,一个事务中可以有多个savepoint,“S1”代表回滚点名称
rollback to [savepoint] S1;
#把事务回滚到标记的点
begin;
update test set money = money + 300 where id = 1;
savepoint s1;
update test set money = money - 300 where id = 2;
savepoint s2;
select * from test;
update test set money = money - 300 where id = 2;
rollback to s2;
rollback to s1;

使用savepoint s1 进行节点标记

 再使用 rollback to savepoint 节点名称进行回滚到你需要的节点状态

此操作不可逆,如果回滚到s1之后,不能回到之后的s2节点,只能往前rollback回滚到事务开始之前的数据

三、总结

1、事务的ACID特性

事务的ACID特性
原子性(Atomicity)事务中的所有操作作为一个整体提交,要么全部执行成功,要么全部失败
一致性(Consistency)事务在执行前后,数据库都必须保持一致性状态
隔离(Isolation)在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间
持久性(Durability)一旦事务提交,对数据库的修改将被永久保存,即使在系统崩溃的情况下也不会丢失

2、事务的隔离级别

事务的隔离级别
读未提交(Read Uncommitted)最低隔离级别,允许脏读、不可重复读和幻读
读已提交(Read Committed)解决了脏读问题,但仍可能出现不可重复读和幻读
可重复读(Repeatable Read)

MySQL默认的隔离级别,解决了脏读和不可重复读问题,但幻读仍

有可能发生

串行化(Serializable)

最高隔离级别,可以避免所有并发问题,但可能会导致性能下降,

几乎等同于事务串行执行

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

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

相关文章

手撕算法-买卖股票的最佳时机 II(买卖多次)

描述 分析 使用动态规划。dp[i][0] 代表 第i天没有股票的最大利润dp[i][1] 代表 第i天持有股票的最大利润 状态转移方程为:dp[i][0] max(dp[i-1][0], dp[i-1][1] prices[i]); // 前一天没有股票,和前一天有股票今天卖掉的最大值dp[i][1] max(dp[i-1…

广州迅腾文化传播助力品牌传播的力量:以声塑形

在市场竞争日益激烈的今天,品牌传播成为企业塑造形象、提升竞争力的关键一环。通过精准的品牌传播策略,企业能够迅速吸引目标消费者的注意,实现新产品的快速推广和市场的占领。品牌传播不仅关乎企业的形象塑造,更关乎企业与消费者…

RIP,EIGRP,OSPF的区别

1.路由协议 能否选择出最优路径 2.路由协议 是否能够完成故障切换/多久能够完成故障切换 3.路由协议 是否会占用过大硬件资源 -- RIP -- 路由信息协议 跳数:一次三层设备的转发算一跳 中间隔的设备数量 不按照链路带宽来算 Rip认为路径一样,这个时候。 下面这个跳数不…

Linux:点命令source

相关阅读 Linuxhttps://blog.csdn.net/weixin_45791458/category_12234591.html?spm1001.2014.3001.5482 source命令用于读取一个文件的内容并在当前Shell环境(包括交互式Shell或是非交互式Shell)执行里面的命令。它被称为点命令是因为命令名source也可…

(三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练

这里写目录标题 一、colmap解算数据放入高斯1. 将稀疏重建的文件放入高斯2. 将稠密重建的文件放入高斯 二、vkitti数据放入高斯 一、colmap解算数据放入高斯 运行Colmap.bat文件之后,进行稀疏重建和稠密重建之后可以得到如下文件结构。 1. 将稀疏重建的文件放入高…

稀碎从零算法笔记Day23-LeetCode:二叉树的最大深度

题型:链表、二叉树的遍历 链接:104. 二叉树的最大深度 - 力扣(LeetCode) 来源:LeetCode 题目描述 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上…

JAVA面向对象编程 JAVA语言入门基础

类与对象的概念 类 (Class) 和对象 (Object) 是面向对象程序设计方法中最核心的概念。 类是对某一类事物的描述(共性),是抽象的、概念上的定义;而对象则是实际存在的属该类事物的具体的个体(个性),因而也称为实例(In…

《边缘计算:连接未来的智慧之桥》

随着物联网、5G等技术的快速发展,边缘计算作为一种新兴的计算模式,正逐渐引起人们的广泛关注。边缘计算通过将数据处理和存储功能放置在距离数据产生源头更近的位置,实现了更快速、更可靠的数据处理和交换,为各行各业带来了前所未…

JS13-事件的绑定和事件对象Event

绑定事件的两种方式/DOM事件的级别 DOM0的写法&#xff1a;onclick element.onclick function () {}举例&#xff1a; <body> <button>点我</button> <script>var btn document.getElementsByTagName("button")[0];//这种事件绑定的方式…

SAP BAS开发Fiori项目中的各种文件详解(manifest.json, package.json, ui5.yaml, i18n等)

1. 背景 在SAP BAS中新建好一个Fiori项目后&#xff0c;系统会自动生成一系列的文件&#xff0c;例如package.json, ui5.yaml, manifest.json, i18n等。对于不熟悉web应用程序开发的同学&#xff0c;这些文件理解起来会很困惑。 在这篇文章中&#xff0c;我会详细介绍这些文件…

图论基础|841.钥匙和房间、463. 岛屿的周长

目录 841.钥匙和房间 思路&#xff1a;本题是一个有向图搜索全路径的问题。 只能用深搜&#xff08;DFS&#xff09;或者广搜&#xff08;BFS&#xff09;来搜。 463. 岛屿的周长 841.钥匙和房间 力扣题目链接 (opens new window) 有 N 个房间&#xff0c;开始时你位于 0…

部署mysql,前端,后端

部署mysql docker pull mysql 从镜像源中拉取镜像。 创建mysql容器 docker run -d \--name mysql_container \-p 3306:3306 \-e TZAsia/Shanghai \-e MYSQL_ROOT_PASSWORD123 \--restartalways \-v /opt/mysql:/var/lib/mysql \mysql -d后台运行&#xff0c;--name指定容器…

SpringBoot2.x 整合SpringDocJavadocknife4j实现无注解零入侵式接口文档

说明 基于 javadoc 无注解零入侵生成规范的 openapi 结构体。 文档工具使用 由于框架采用 openapi 行业规范 故市面上大部分的框架均支持 可自行选择 例如: apifox apipost postman torna knife4j 等 根据对应工具的文档接入即可 Swagger升级SpringDoc指南 常见功能如下 其他…

蓝桥杯day12刷题日记

P8720 [蓝桥杯 2020 省 B2] 平面切分 思路&#xff1a;首先借用dalao的图解释一下&#xff0c;又多出一条与当前平面任意一条直线都不重合线时&#xff0c;多了的平面是交点数1&#xff0c;所以用双层循环每次往里面加一条直线&#xff0c;计算交点 #include <iostream>…

Unity学习笔记 6.2D换帧动画

下载源码 UnityPackage 目录 1.导入图片 1.1. 图片的叠放顺序 2.图片切片 3.用动画控制器让马&#x1f40e;动起来 1.导入图片 直接拖拽进场景 检查 Texture Type&#xff08;纹理类型&#xff09;是否为 Sprite 创建2D精灵对象&#xff0c;拖拽图片到Sprite&#xff08…

【spring】@DependsOn注解学习

DependsOn介绍 DependsOn 是 Spring 框架中的一个注解&#xff0c;用于指定一个 bean 的依赖关系。当 Spring 容器初始化 bean 时&#xff0c;它会按照一定的顺序进行初始化。如果一个 bean 依赖于其他 bean&#xff0c;那么这个 bean 的初始化应该在依赖的 bean 之后进行。 …

2024年noc指导教师认证测评参考试题题目3-4合集

[noc指导教师认证] 测评参考试题 说明:NOC教师指导认证考试题目是从题库里抽题,因此每位老师每次考试题目都不一样以下题目为测试考试时收集到的一些题目,作为辅助提供给各位老师,老师们可以记住题目及答案的具体内容 (选项顺序会变),以免考试时遇到。2024年的做的题目有的…

MISC:zip压缩包伪加密破解及其结构解析

一.前言 遇到zip压缩包是被加密的&#xff0c;但加密有时侯是伪加密&#xff0c;需要我们进行破解。 二.压缩包解析 1. 压缩源文件数据区 zip文件头标记 文件头&#xff1a;504B0304 解压文件所需的pkware版本 全局方式位标记 如果四位中的第二位为奇数则表示有加密&#xff…

Elasticsearch:将 ILM 管理的数据流迁移到数据流生命周期

警告&#xff1a;此功能处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题&#xff0c;但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束。目前的最新版本为 8.12。 在本教程中&#xff0c;我们将了解如何将现有数据流&#xff0…