【MySQL | 八、 事务管理】

news2025/4/19 2:41:37

文章目录

  • 什么是事务?
  • 事务的特性:
  • 事务的意义
  • 事务的提交
    • 查看事务提交方式
    • 事务的自动提交
    • 事务的手动提交
      • 开始事务
      • 执行SQL操作
      • 事务操作
      • 提交事务
      • 示例:
  • 事务的隔离级别
    • 并发访问的基本概念
    • 并发事务的典型问题
    • 对ACID特性的影响
    • 查看和设置隔离属性
    • 各个隔离级别的详细介绍
      • 读未提交`EAD UNCOMMITTED`
      • 读提交`READ COMMITTED`
      • 可重复读`REPEATABLE READ`(默认)
      • 串行化`SERIALIZABLE`

什么是事务?

在 MySQL 中只有使用了 ==InnoDB 数据库引擎的数据库或表才支持事务, MyISAM 不支持。==事务(Transaction) 是一组(可以为一句或多句)SQL 语句的集合,这些语句作为一个整体执行,要么全部成功,要么全部失败。

事务的特性:

事务通常用 ACID 特性来描述:

  • 原子性(Atomicity)
    事务中的所有操作要么全部成功,要么全部失败。如果事务中的任何一条语句失败,整个事务都会被回滚(Rollback),恢复到事务开始前的状态。
  • 一致性(Consistency)
    事务执行后,数据库必须从一个一致的状态转换到另一个一致的状态。一致性可以理解为“目标达成过程是合理且符合规则的”。例如,转账操作中,总金额在转账前后应该保持一致。
  • 隔离性(Isolation)
    多个并发事务之间相互隔离,一个事务的操作不会影响其他事务。MySQL 提供了不同的隔离级别(如 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ、SERIALIZABLE)来控制事务的隔离程度。
  • 持久性(Durability)
    一旦事务提交(Commit),它对数据库的修改就是永久性的,即使系统发生故障也不会丢失

事务的意义

事务的主要目的是确保数据库的完整性和一致性,特别是在并发操作和系统故障的情况下。

  1. 确保数据完整性
    事务将一组操作(SQL 语句)打包成一个逻辑单元,要么全部成功,要么全部失败。
    例子:银行转账操作中,从账户 A 扣款和向账户 B 加款必须同时成功或同时失败。如果只有扣款成功而加款失败,数据就会不一致。
    意义:事务避免了部分操作成功、部分操作失败导致的数据不一致问题。
  2. 支持并发操作
    在多用户或多应用同时访问数据库时,事务通过隔离性确保并发操作不会互相干扰。
    例子:用户 A 和用户 B 同时修改同一条数据,事务可以确保他们的操作按顺序执行,而不是互相覆盖。
    意义:事务保证了并发环境下的数据正确性。
  3. 提供故障恢复机制
    在系统发生故障(如断电、崩溃)时,事务的持久性确保已提交的操作不会丢失,而未提交的操作会被回滚。
    例子:如果数据库在转账过程中崩溃,事务可以确保恢复到转账前的状态,避免数据损坏。
    意义:事务提高了系统的可靠性和容错能力。
  4. 简化复杂操作
    事务将复杂的操作封装成一个逻辑单元,开发者不需要手动处理每一步操作的成功或失败。
    例子:在电商系统中,下单操作可能涉及库存减少、订单记录生成、支付状态更新等多个步骤,事务可以确保这些步骤要么全部成功,要么全部回滚。
    意义:事务简化了开发流程,降低了出错概率。
  5. 支持一致性约束
    事务可以确保数据库从一个一致状态转换到另一个一致状态,满足业务规则和约束条件。
    例子:在库存管理系统中,库存数量不能为负数,事务可以确保所有操作都符合这一规则。
    意义:事务维护了数据的逻辑正确性。

事务的提交

没错,事务是需要提交的。

查看事务提交方式

show variables like 'autocommit';

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.41 sec)

autocommit = 1(ON):表示自动提交
autocommit = 0(OFF):表示禁止自动提交

事务的自动提交

在 MySQL 中,默认情况下,每条 SQL 语句都会自动提交autocommit = 1(ON)

事务的手动提交

SET 来改变 MySQL 的自动提交模式:

mysql> SET AUTOCOMMIT=0; 
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | OFF |
+---------------+-------+
1 row in set (0.00 sec)

autocommit = 0(OFF)时需要手动提交:

开始事务

使用 START TRANSACTIONBEGIN 语句开始一个新的事务。

执行SQL操作

在事务中执行一系列 SQL 操作(如 INSERTUPDATEDELETE)。

事务操作

创建临时保存点: savepoint save2;(save2为保存点的名)
回滚操作:rollback to save2;(回滚到save2保存点)
rollback:回滚到最开始
如果一个事务被提交了(commit),则不可以回退(rollback)

提交事务

使用COMMIT进行事务提交。

示例:

#开始事务
START TRANSACTION;

#操作1:从账户1扣款100元
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
#操作2:向账户2加款100元
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;

#提交事务
COMMIT;

事务的隔离级别

并发访问的基本概念

在数据库领域,并发特指数据库系统同时处理多个事务的能力,允许不同用户/应用程序同时访问和修改数据。

MySQL服务会被多个客户端进程/线程并发访问,这些访问以事务方式执行。

并发事务的典型问题

如果没有适当的事务隔离机制(Isolation),并发事务之间会产生三种典型问题

  1. 脏读(Dirty Read):事务A读取到事务B未提交的修改
  2. 不可重复读(Non-repeatable Read):事务A内两次读取同一数据,结果不同(因事务B在此期间修改了数据)
  3. 幻读(Phantom Read):事务A两次查询同一条件,得到不同记录集(因事务B在此期间新增/删除了数据)

对ACID特性的影响

这些问题会破坏事务的ACID特性中的:

  • 一致性:事务执行后数据库应保持合法状态
  • 隔离性:事务间不应相互干扰

事务隔离性指的是在并发环境下,一个事务的执行不应受到其他并发事务的干扰,每个事务都应该像是在独立执行一样。确保业务逻辑的正确执行,避免因并发导致的数据逻辑错误。
上述问题MySQL通过四种隔离级别解决这些问题:

隔离级别脏读不可重复读幻读备注
读未提交 EAD UNCOMMITTED最低隔离级别
读提交 READ COMMITTED×Oracle默认级别
可重复读 REPEATABLE READ(默认)××MySQL默认级别
串行化 SERIALIZABLE×××最高隔离级别

*注:MySQL的InnoDB引擎通过间隙锁(Gap Lock)在REPEATABLE READ级别也能避免大部分幻读

隔离级别如何实现:隔离,基本都是通过锁实现的,不同的隔离级别,锁的使用是不同的。常见有,表
锁,行锁,读锁,写锁,间隙锁(GAP),Next-Key锁(GAP+行锁)等,

查看和设置隔离属性

隔离属性作用域是事务或会话
@@global.tx_isolation:全局事务隔离级别
@@session.tx_isolation:当前会话隔离级别
@@tx_isolation:等同于@@session.tx_isolation

#查看全局事务隔离级别和(当前)会话事务隔离级别
SELECT@@global.tx_isolation,@@session.tx_isolation;

#设置隔离事务级别
set [session | global] 
transaction isolation level 
[read uncommitted | read commit | repeatable read | serializable]; 
#设置当前会话的隔离事务级别为 serializable
set session 
transaction isolation level 
serializable;
  • MySQL默认@@global.tx_isolation值为:REPEATABLE READ(可重复读)。
  • 新会话的@@session.tx_isolation会继承@@global.tx_isolation的当前值。
  • 全局事务隔离级别用于初始化会话隔离事务级别的值。
  • 更新@@global.tx_isolation后只对于后续新创立的会话的@@session.tx_isolation生效。已有会话的隔离级别不变。
  • 更新@@session.tx_isolation后只对于当前会话后续新建的事务生效。已开启的事务不生效。

各个隔离级别的详细介绍

  • 每个事务的读取行为只受自身隔离级别控制
  • 写操作会受其他事务的隔离级别间接影响(通过锁机制)
  • 不同级别事务间的交互需要通过锁机制协调
    假设:有两个会话A、B。
    场景:银行转账业务C、D两个账户(初始余额:C=1000,D=1000)
    假设:会话B新建事务(进行向D账户转100,转三次,并新增一个E账户存1000)

读未提交EAD UNCOMMITTED

当A在新建事务前为此隔离等级此时不论B会话处于什么隔离级别,A会话下事务可以随时读取B下事务未提交的结果 A会话下的事务每次访问D账户的余额可能不同,同时随时可能新增一个账户 显示这是脏读、不可重复读和幻读


此隔离级别下的事务几乎没有隔离性。

读提交READ COMMITTED

当A会话在新建事务前为此隔离等级那么A会话下的事务在B会话下的事务未提交前是看不到D账户有任何变化的,但若B下的事务早于A下的事务进行了提交,那么A下的事务每次查询(提交前和提交后)的结果仍可能不同显然这是不可重复读和幻读

可重复读REPEATABLE READ(默认)

在MYSQL中当A会话在新建事务前为此隔离等级 A会话下的事务看不到其他事务在A启动后提交的任何新数据

值得一提的是: 一般的数据库在可重复读情况的时候,无法屏蔽其他事务insert的数据(为什么?因为隔离性实现是对数据加锁完成的,而insert待插入的数据因为并不存在,那么一般加锁无法屏蔽这类问题),会造成虽然大部分内容是可重复读的,但是insert的数据在可重复读情况被读取出来,导致多次查找时,会多查找出来新的记录,就如同产生了幻觉。这种现象,叫做幻读。很明显,MySQL在RR级别的时候,是解决了幻读问题的(解决的方式是用Next-Key锁(GAP+行锁)解决的。

串行化SERIALIZABLE

对所有操作全部加锁,进行串行化,不会有问题。

隔离级别越严格,安全性越高,但数据库的并发性能也就越低,往往需要在两者之间找一个平衡点。

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

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

相关文章

AlDente Pro for Mac电脑 充电限制保护工具

AlDente Pro for Mac电脑 充电限制保护工具 一、介绍 AlDente Pro for Mac,是一款充电限制保护工具,是可以限制最大充电百分比来保护电池的工具。锂离子和聚合物电池(如 MacBook 中的电池)在40% 至 80% 之…

算法训练之动态规划(一)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

Navicat连接远程PostGreSQL失败

问题描述 使用本地Navicat连接Windows远程服务器上部署的PostGreSQL数据库时,出现以下错误: 解决方案 出现以上报错信息,是因为PostGreSQL数据库服务尚未设置允许客户端建立远程连接。可做如下配置, 1. 找到PostGreSQL数据库安装目录下的data子文件夹,重点关注:postgres…

新一代达梦官方管理工具SQLark:可视化建表操作指南

在数据库管理工作中,新建表是一项基础且频繁的操作。SQLark 的可视化建表功能为我们提供了一种高效、便捷且丝滑流畅的建表新体验。一起来了解下吧。 SQLark 官方下载链接:www.sqlark.com 新建表作为常见的功能,相比其他管理工具,…

什么是EXR透视贴图 ?

EXR透视贴图是一种基于 OpenEXR 格式的高动态范围(HDR)图像技术,主要用于3D建模、渲染和视觉特效领域。它通过高精度图像数据和透视映射功能,为场景创建逼真的光影效果和空间深度。 技术原理 高动态范围(HDR&#xf…

每日一题(小白)数组娱乐篇21

由于题意可知我们是要将对应的数字转换为英文,我们要考虑两点一个是进制的转换,也就是类似于我们的十进制一到9就多一位,这里的进制就是Z进制也就是27进制一旦到26下一位则进位;另一方面要考虑数字的转换也就是1~26对应A~Z。解决上…

LINUX的使用(1)-挂载云硬盘

1.磁盘的挂载: 这个输出是来自 fdisk 或类似的工具,它展示了两块磁盘的分区信息。让我们逐个分析: 第一块磁盘 /dev/sda: 磁盘大小: 53.7 GB (约 53687091200 字节),总共有 104857600 个扇区。扇区单位: 每个扇区大小为 512 字节…

GPT-4o-image模型:开启AI图片编辑新时代

在生成式AI技术爆发式迭代的今天,智创聚合API率先突破多模态创作边界,正式发布集成GPT-4o-image模型的创作平台,以“文生图-图生图-循环编辑”三位一体的技术矩阵,重新定义数字内容生产流程。生成图像效率较传统工具提升300%&…

使用pip3安装PyTorch与PyG,实现NVIDIA CUDA GPU加速

使用python3的pip3命令安装python依赖库。 # python3 -V Python 3.12.3 # # pip3 -V pip 25.0.1 from /root/.pyenv/versions/3.12.3/lib/python3.12/site-packages/pip (python 3.12)Usage: pip3 install [options] <package> ...pip3 install [options] -r <re…

Rust主流框架性能比拼: Actix vs Axum vs Rocket

本内容是对知名性能评测博主 Anton Putra Actix (Rust) vs Axum (Rust) vs Rocket (Rust): Performance Benchmark in Kubernetes 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在以下中&#xff0c;我们将比较 Rust 生态中最受欢迎的几个框架。我会将三个应用程序…

【QT】QT的消息盒子和对话框(自定义对话框)

QT的消息盒子和对话框&#xff08;自定义对话框&#xff09; 一、消息盒子QMessageBox1、弹出警告盒子示例代码&#xff1a;现象&#xff1a; 2、致命错误盒子示例代码&#xff1a;现象&#xff1a; 3、帮助盒子示例代码&#xff1a;现象&#xff1a; 4、示例代码&#xff1a; …

【结合vue源码,分析vue2及vue3的数据绑定实现原理】

结合vue源码&#xff0c;分析vue2及vue3的数据绑定实现原理 Vue 2 数据绑定实现整体思路详细实现1. Observer 类&#xff1a;数据劫持2. Dep 类&#xff1a;依赖收集3. Watcher 类&#xff1a;订阅者 Vue 3 数据绑定实现整体思路详细实现1. reactive 函数&#xff1a;创建响应式…

如何实现H5端对接钉钉登录并优雅扩展其他平台

如何实现H5端对接钉钉登录并优雅扩展其他平台 钉钉H5登录逻辑后端代码如何实现&#xff1f;本次采用策略模式工厂方式进行定义接口确定会使用的基本鉴权步骤具体逻辑类进行实现采用注册表模式&#xff08;Registry Pattern&#xff09;抽象工厂进行基本逻辑定义具体工厂进行对接…

LabVIEW真空度监测与控制系统

开发了一种基于LabVIEW的真空度信号采集与管理系统&#xff0c;该系统通过图形化编程语言实现了真空度的高精度测量和控制。利用LabVIEW的强大功能&#xff0c;研制了相应的硬件并设计了完整的软件解决方案&#xff0c;以满足工业应用中对真空度监测的精确要求。 项目背景 随着…

虚拟dom工作原理以及渲染过程

浏览器渲染引擎工作流程都差不多&#xff0c;大致分为5步&#xff0c;创建DOM树——创建StyleRules——创建Render树——布局Layout——绘制Painting 第一步&#xff0c;用HTML分析器&#xff0c;分析HTML元素&#xff0c;构建一颗DOM树(标记化和树构建)。 第二步&#xff0c;用…

数据采集爬虫三要素:User-Agent、随机延迟、代理ip

做爬虫的朋友都懂&#xff1a;你刚打开一个页面&#xff0c;还没来得及发第二个请求&#xff0c;服务器已经把你当成了“可疑流量”。403、429、验证码、JS挑战……这些“欢迎仪式”你是不是也经常收到&#xff1f;防爬策略越来越猛&#xff0c;采集工程师越来越秃。 但别慌&am…

汽车的四大工艺

文章目录 冲压工艺核心流程关键技术 焊接工艺核心流程 涂装工艺核心流程 总装工艺核心流程终检与测试静态检查动态检查四轮定位制动转鼓测试淋雨测试总结 简单总结下汽车的四大工艺&#xff08;从网上找了一张图&#xff0c;感觉挺全面的&#xff09;。 冲压工艺 将金属板材通过…

【JVM是什么?JVM解决什么问题?JVM在JDK体系中是什么?虚拟机和JVM、操作系统是什么关系?】

1. JVM 是什么&#xff1f; JVM&#xff08;Java Virtual Machine&#xff0c;Java 虚拟机&#xff09; 是一个虚拟的计算机程序&#xff0c;它是 Java 程序运行的核心环境。JVM 的主要职责是加载、验证、解释或编译 Java 字节码&#xff08;.class 文件&#xff09;&#xff…

10-MySQL-性能优化思路

1、优化思路 当我们发现了一个慢SQL的问题的时候,需要做性能优化,一般我们是为了提高SQL查询更快,一个查询的流程由下图的各环节组成,每个环节都会消耗时间,要减少消耗时候需要从各个环节都分析一遍。 2 连接配置优化 第一个环节是客户端连接到服务端,这块可能会出现服务…

MySQL学习笔记十

第十二章汇总数据 12.1聚集函数 聚集函数运行在行组上&#xff0c;计算和返回单个值。 12.1.1AVG()函数 输入&#xff1a; SELECT AVG(prod_price) AS avg_price FROM products; 输出&#xff1a; 说明&#xff1a;AVG()函数通过对表中行数计数并计算特定列值之和&#…