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能够检测到死锁并自动回滚一个事务。
  • 性能:较高的隔离级别会降低并发性能,因此在实际应用中需要根据需求选择合适的隔离级别。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【踩坑】解决运行一段时间GPU计算后忽然变得很慢

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 发现问题 问题分析 修复思路 思路一 思路二 思路二对应代码 这个问题真的找了我好久,但说起来其实也简单,就是GPU温…

JDK8-17新特性

一、JDK8新特性:Lambda表达式 1.Lambda表达式及其使用举例 Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力…

17个有用的CLI命令

作为前端开发工程师,我们需要了解哪些命令?如果您熟悉这些命令,它们将大大提高您的工作效率。 1. tree 你们知道如何列出一个目录的文件结构吗?它在显示文件之间的目录关系方面做得很好 commands ├── a.js ├── b.js ├── …

PyTorch计算机视觉入门:从官方数据集到自定义数据集的获取

一、PyTorch与计算机视觉简介 PyTorch是一个开源的深度学习框架,其动态图的特性非常适合快速实验和模型原型设计。在计算机视觉任务中,如图像分类、目标检测、图像分割等,PyTorch提供了丰富的API和预训练模型,帮助开发者快速搭建…

C++ 不定参数模版

使用不定参数模版遇到一个小问题&#xff0c;做个记录 测试代码如下&#xff1a; template<typename T, typename ...Args> void pushToVectorIfParamIsStr(std::vector<std::string>& vec, T &&value,Args&&... args) {const bool is std:…

大模型中的计算精度——FP32, FP16, bfp16之类的都是什么???

大模型中的计算精度——FP32, FP16, bfp16之类的都是什么&#xff1f;&#xff1f;&#xff1f; 这些精度是用来干嘛的&#xff1f;&#xff1f;混合精度 mixed precision training什么是混合精度&#xff1f;怎么转换呢&#xff1f; 为什么大语言模型通常使用FP32精度训练量化…

调试了一下午,终于把tailwindcss搞进Blazor了

在Vue和Uniapp项目中使用tailwindcss后&#xff0c;实在是太香了&#xff0c;非常符合我这从XAML走过来的老程序员的手感&#xff0c;所以老想着在Blazor项目中引入。看了几个老外大佬的视频&#xff0c;调试了一下午&#xff0c;终于是捣鼓成功了。由于咱们Blazor项目不在node…

【c语言】文件操作,解开你的疑惑

文件操作 为什么使用文件什么是文件文件的分类文件名 二进制文件和文本文件文件的打开与关闭流与标准流流标准流 文件指针文件的打开与关闭 文件的顺序读写文件的随机读写文件读取结束的判定文件缓冲区 为什么使用文件 我们程序运行的数据是运行在内存中的&#xff0c;当成程序…

链表经典题目:环形链表问题(LeetCode141.环形链表、LeetCode142.环形链表Ⅱ)

&#x1f4c7;文章目录 &#x1f4dc; LeetCode141. 环形链表&#x1f536;题目描述&#x1f537;思路分析✔️代码实现 &#x1f4dc; LeetCode142.环形链表Ⅱ&#x1f536;题目描述&#x1f537;思路①✔️代码实现&#x1f537;思路② &#x1f4d2;总结 &#x1f4dc; Leet…

神经网络学习2

张量&#xff08;Tensor&#xff09;是深度学习和科学计算中的基本数据结构&#xff0c;用于表示多维数组。张量可以看作是一个更广义的概念&#xff0c;涵盖了标量、向量、矩阵以及更高维度的数据结构。具体来说&#xff0c;张量的维度可以是以下几种形式&#xff1a; 标量&am…

RabbitMQ实践——利用一致性Hash交换器做负载均衡

大纲 开启一致性Hash交换器创建交换器创建绑定关系测试参考资料 在《RabbitMQ实践——交换器&#xff08;Exchange&#xff09;和绑定&#xff08;Banding&#xff09;》中&#xff0c;我们熟悉了Direct、Fanout、Topic和Header这4种系统默认支持的交换器。这些交换器基本可以满…

Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

军事武器3D数字化交互展示创作平台大大降低成本

军事力量和装备是一个国家国防安全的重要支柱&#xff0c;这在全球范围内得到广泛认同&#xff0c;为了让入伍的新兵能快速熟悉和掌握武器装备操作流程&#xff0c;基于创新型的华锐3D云展平台工具&#xff0c;搭建的3D军事武器展示搭建编辑器&#xff0c;让部队的军事武器展示…

Golang——gRPC gateway网关

前言 etcd3 API全面升级为gRPC后&#xff0c;同时要提供REST API服务&#xff0c;维护两个版本的服务显然不大合理&#xff0c;所以gRPC-gateway诞生了。通过protobuf的自定义option实现了一个网关。服务端同时开启gRPC和HTTP服务&#xff0c;HTTP服务接收客户端请求后转换为gr…

Javaweb8 数据库Mybatis+JDBC

Mybatis Dao层&#xff0c;用于简化JDBC开发 1步中的实体类 int类型一般用Integer &#xff1a;如果用int类型 默认值为0,会影响数据的判断,用Integer默认值是null,不会给数据的判断造成干扰 2.在application .properties里配置数据库的链接信息-四要素 #驱动类名称 #URL #用…

Elasticsearch 认证模拟题 - 21

一、题目 写一个查询&#xff0c;要求查询 kibana_sample_data_ecommerce 索引&#xff0c;且 day_of_week、customer_gender、currency、type 这 4 个字段中至少两个以上。 1.1 考点 Boolean 1.2 答案 GET kibana_sample_data_ecommerce/_search {"query": {&q…

C-冒泡排序的循环条件应该怎么写

目录 一、冒泡排序的原理 二、代码实现 三、代码解读 1. 第一层循环条件怎么来的 2.第二层循环条件怎么来的 四、优化代码 我发现&#xff0c;好像还是有一部分同志&#xff0c;没有很清楚冒泡排序的两层循环条件为什么这么写&#xff1f; 感到有些模糊&#xff0c;但又可…

光照药物稳定性试验箱百科

概念与作用 - 药品稳定性试验箱&#xff1a;一种精密设备&#xff0c;用于模拟药品在不同环境条件下的存储情况。 - 环境模拟&#xff1a;通过控制温度、湿度等参数&#xff0c;复制各种实际储存条件&#xff0c;以测试药品稳定性。 - 保障药品质量&#xff1a;通过试验&…

Mybatis做批量操作

动态标签foreach&#xff0c;做过批量操作&#xff0c;但是foreach只能处理记录数不多的批量操作&#xff0c;数据量大了后&#xff0c;先不说效率&#xff0c;能不能成功操作都是问题&#xff0c;所以这里讲一讲Mybatis正确的批量操作方法&#xff1a; 在获取opensession对象…

conda安装pytorch使用清华源

原命令&#xff0c;例&#xff1a; # CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatoolkit11.3 -c pytorch使用清华源&#xff0c;例&#xff1a; # CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatool…