MySQL -- 事务

MySQL事务是数据库操作的一个重要概念,事务是指一组操作要么全部完成,要么全部不完成,是数据库的一个逻辑工作单元。事务的主要目的是确保数据库的一致性和可靠性。

  • 事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果。保证事务执行的原子操作。
  • 事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上。
  • 事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态。

1. 事务的特性(ACID)

事务具有四个主要特性,通常被称为ACID特性:

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。事务在执行过程中发生错误会回滚到事务开始前的状态,就像这个事务从未执行过一样。
  • 一致性(Consistency):事务执行前后,数据库必须保持一致性。比如,事务的执行不能违反数据库的完整性约束。
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。不同的隔离级别可以控制事务的可见性。
  • 持久性(Durability):事务一旦提交,其结果就永久保存到数据库中,即使系统发生故障也不会丢失。

2. MySQL 事务控制语句

MySQL 提供了一组事务控制语句来管理事务:

  • START TRANSACTION:显式地开启一个事务。
  • COMMIT:提交事务,将事务中的所有操作保存到数据库中。
  • ROLLBACK:回滚事务,撤销事务中的所有操作。
  • SAVEPOINT:设置保存点,可以回滚到特定的保存点,而不是回滚整个事务。
  • RELEASE SAVEPOINT:删除一个保存点。
  • SET TRANSACTION:设置事务的隔离级别。

3. 事务的隔离级别

MySQL 提供了四种事务隔离级别,可以通过 SET TRANSACTION ISOLATION LEVEL 语句来设置:

  • READ UNCOMMITTED:最低的隔离级别,一个事务可以读取未提交的其他事务的数据。这会导致脏读(Dirty Read)问题。
  • READ COMMITTED:一个事务只能读取已经提交的事务的数据,避免了脏读问题,但可能会出现不可重复读(Non-repeatable Read)问题。
  • REPEATABLE READ:默认的隔离级别,一个事务在开始时看到的数据是一致的,即使其他事务进行了更新,也不会看到变化,避免了不可重复读问题,但可能会出现幻读(Phantom Read)问题。
  • SERIALIZABLE:最高的隔离级别,通过强制事务顺序执行,避免了所有并发问题,但性能会受到影响。
1. 脏读(Dirty Read)

脏读是指一个事务读取了另一个事务尚未提交的数据。这种情况可能导致读取到的数据是临时的或错误的,因为读取的事务无法保证这些数据最终会被提交。

示例

  1. 事务A更新了一条记录的值,但尚未提交。
  2. 事务B读取了事务A更新后的值。
  3. 事务A回滚,撤销了更新。
  4. 事务B读取到的数据是不存在的临时数据,这就是脏读。

解决方法:通过设置隔离级别为 READ COMMITTED 或更高,可以避免脏读。

2. 不可重复读(Non-repeatable Read)

不可重复读是指在一个事务中两次读取同一条记录却得到了不同的结果。这通常是因为在两次读取之间,另一个事务修改并提交了这条记录。

示例

  1. 事务A读取了一条记录的值。
  2. 事务B更新并提交了这条记录的值。
  3. 事务A再次读取同一条记录,得到了与第一次读取不同的值。

解决方法:通过设置隔离级别为 REPEATABLE READ 或更高,可以避免不可重复读。

3. 幻读(Phantom Read)

幻读是指在一个事务中两次查询同一条件的数据集,却得到了不同的数据集结果。这通常是因为在两次查询之间,另一个事务插入或删除了符合条件的记录。

示例

  1. 事务A执行一条查询语句,查找符合某个条件的所有记录。
  2. 事务B插入了一条新记录,该记录符合事务A的查询条件,并提交。
  3. 事务A再次执行相同的查询,结果集包含了事务B插入的那条新记录。

解决方法:通过设置隔离级别为 SERIALIZABLE 可以避免幻读。

隔离级别和并发问题

为了更好地理解如何通过隔离级别避免这些并发问题,下面是各隔离级别对脏读、不可重复读和幻读的影响:

隔离级别脏读不可重复读幻读
READ UNCOMMITTED允许允许允许
READ COMMITTED不允许允许允许
REPEATABLE READ不允许不允许允许
SERIALIZABLE不允许不允许不允许

通过选择适当的隔离级别,可以在性能和数据一致性之间取得平衡。例如,在高并发的环境中,为了提高性能,可能选择较低的隔离级别(如 READ COMMITTED),而在需要严格数据一致性的场景中,可能选择较高的隔离级别(如 SERIALIZABLE)。

串行化:锁实现    给所有事务排序。并发的效率低,数据的安全性高。

未提交读:没有做任何的并发控制。并发的效率高,数据的安全性最低。

已提交读(oracle)和可重复读(mysql):结合了数据的安全性&一致性和并发效率,MVCC多版本并发控制机理实现

4. 事务的使用示例

-- 开始事务
START TRANSACTION;-- 执行一些SQL操作
INSERT INTO accounts (account_id, balance) VALUES (1, 1000);
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;-- 提交事务
COMMIT;

 在出现错误时可以回滚事务

-- 开始事务
START TRANSACTION;-- 执行一些SQL操作
INSERT INTO accounts (account_id, balance) VALUES (1, 1000);
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
-- 假设这里发生了错误
-- ROLLBACK 事务
ROLLBACK;

5. 保存点的使用

保存点可以在事务中创建多个回滚点,以实现部分回滚:

-- 开始事务
START TRANSACTION;-- 执行一些SQL操作
INSERT INTO accounts (account_id, balance) VALUES (1, 1000);
SAVEPOINT sp1;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;-- 创建另一个保存点
SAVEPOINT sp2;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;-- 回滚到第一个保存点
ROLLBACK TO sp1;-- 提交事务
COMMIT;

6. 隔离级别的设置

可以在全局或会话级别设置隔离级别:

-- 设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 设置会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

7. 注意事项

  • 死锁:当两个事务相互持有对方需要的资源时,会发生死锁。MySQL能够检测到死锁并自动回滚一个事务。
  • 性能:较高的隔离级别会降低并发性能,因此在实际应用中需要根据需求选择合适的隔离级别。

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

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

相关文章

企业该怎么进行流程管理?

众所周知,流程管理在企业中是一种有效的方法,可以帮助组织优化运营、提高效率并降低成本。 下面是一些步骤,可以帮助大家在企业中实施流程管理: 确定目标:首先,明确企业的目标和愿景。这将帮助您确定需要…

最佳 PDF 合并工具评测

PDF是我们官方文档常用的格式。因此,如今处理 PDF 文件是一项非常重要的技能,例如使用 doc 创建 pdf、将 pdf 文件合并为单个 pdf、将 pdf 拆分为多个 pdf 文件、为 pdf 文件添加密码以进行安全分发等等。获得上述技能的关键部分是找到一个简单但功能强大…

如何高效使用大型语言模型 LLMs 初学者版本 简单易上手

第一条也是最重要的一条规则是 永远不要要求LLM提供你无法自己验证的信息, 或让它完成你无法验证其正确性的任务。 唯一例外的情况是那些无关紧要的任务, 例如,让大型语言模型提供公寓装修灵感之类的是可以的 。 首先请看两个范例 不佳示范&#xff1a…

Qwen-VL图文多模态大模型LoRA微调指南

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模…

介绍并改造一个作用于Anki笔记浏览器的插件

在Anki的笔记浏览器窗口中,作为主体部分的表格在对获取到的笔记进行排序时,最多只能有一个排序字段,在设定笔记的排序字段后,没法将表格中的笔记按其他字段进行排序。要满足这个需求,可以使用Advanced Browser插件&…

怎么用AI绘画完成设计创作?

AI绘画工具为设计师提供了强大的功能和便利性,用AI绘画进行艺术创作能够使设计师能够更快地迭代和优化设计方案,提高设计效率。那么怎么用AI绘画完成设计创作? 要使用AI绘画完成设计创作,首先需要选择一个合适的工具。目前市场上有很多优秀的…

Springboot微服务整合缓存的时候报循环依赖的错误 两种解决方案

错误再现 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2024-06-17 16:52:41.008 ERROR 20544 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLI…

【Oracle生产运维】数据库服务器高负载排查处理

说明 在Oracle数据库运维工作中,经常会遇到Oracle数据库服务器平均负载(load average)突然异常升高,如果放任不管,严重的情况下会出现数据库宕机、服务器重启等重大故障。因此,当发现数据库服务器平均负载…

Humanize,一个很有人情味的 Python 库

目录 01初识 Humanize 为什么选择 Humanize? 安装 Humanize 02时间与日期的处理 时间差的展示 日期的展示 03数字的处理 数字的单位转换 数字的精确度控制 数字的千位分隔符 04文件大小的处理 文件…

一文学会消息中间件的基础知识

什么是消息队列 队列数据结构 我们都学习过数据结构与算法相关的内容,消息队列从数据结构来看,就是一个由链表或是数组构成的一个先进先出的数据容器。由链表实现还是数组实现都没关系,它只要满足数据项是先进先出的特点,那么就可以认为它是一个队列结构。队列是只允许在…

智能制造uwb高精度定位系统模块,飞睿智能3厘米定位测距芯片,无人机高速传输

在科技日新月异的今天,定位技术已经渗透到我们生活的方方面面。从手机导航到自动驾驶,再到无人机定位,都离不开精准的定位系统。然而,随着应用场景的不断拓展,传统的定位技术如GPS、WiFi定位等,因其定位精度…

Java:113-Spring Data JPA详解

Spring Data JPA详解 Spring Data Jpa 是应用于Dao层的⼀个框架,简化数据库开发的,作用和Mybatis框架⼀样,但是在使用方式和底层机制是有所不同的,最明显的⼀个特点,Spring Data Jpa 开发Dao的时候,很多场景…

天锐绿盾数据防泄密软件有哪些功能

天锐绿盾数据防泄密软件的功能丰富而全面,旨在从源头上保障企业数据的安全。以下是对其主要功能的归纳和介绍: www.drhchina.com 一、文件加密模块 透明加密:在不影响用户工作流程的前提下,对需要保护的文件进行自动加密处理。文…

别再这么起号了!TikTok小白起号误区,你中招了吗?

看过不少Tiktok新手的起号失败案例,总结下来就是以下这几个问题,今天结合一些个人起号心得给大家分享怎么成功在TK起号,希望对大家有所帮助。 手机/网络环境 首先我们要确保手机环境和网络环境没有问题,如果被TK判断出是非海外用户…

数据治理服务解决方案(35页WORD)

方案介绍: 本数据治理服务解决方案旨在为企业提供一站式的数据治理服务,包括数据规划、数据采集、数据存储、数据处理、数据质量保障、数据安全及合规等方面。通过构建完善的数据治理体系,确保企业数据的准确性、完整性和一致性,…

【Python】PySide6使用入门和注意事项

文章目录 前言关于PySide和PyQtQt Designerpyside6在vscode中ui文件转换兼容性问题主程序结构蓝牙协议初探(应用层) 前言 最近在开发一个带界面的软件,需要使用蓝牙,然后找到一个开源仓库使用的是Qt里面的Qbluetooth模块&#xff…

List实现类——ArrayList、LinkedList及迭代器(并发修改异常错误)源码分析

1、ArrayList本质及源码分析 两种情况:加一个和很多个 底层原理:elementData是底层数组的名字 再次满了的话,在扩容1.5倍 如果利用addAll一次添加多个元素,按实际元素数进行扩容 源码分析: 1、空参构造,…

STORM论文阅读笔记

这是篇NIPS2023的 world model 论文文章提出,WM的误差会在训练过程中积累从而影响policy的训练,向WM中加噪声可以改善这一点。其他的流程和IRIS差不多,差别在以下几点: image encoder,IRIS用的VQVAE, 本文用的是VAE&am…

看穿人性!现货白银交易的一些博弈心得

很多投资者认为现货白银交易最应该讲求的是交易技巧,但交易的技巧和套路是“死”的,行情走势却是“活”的,投资者需要在实践中不断地累积经验和总结心得,才能更加灵活地面对行情走势的变化,逐步达至盈利的理想彼岸。 无…

本地安装nightingale监控分析服务并发布公网详细流程

文章目录 前言1. Linux 部署Nightingale2. 本地访问测试3. Linux 安装cpolar4. 配置Nightingale公网访问地址5. 公网远程访问Nightingale管理界面6. 固定Nightingale公网地址 前言 本文主要介绍如何在本地Linux系统部署 Nightingale 夜莺监控并结合cpolar内网穿透工具实现远程…