0


MySQL 篇-深入了解事务四大特性及原理

🔥博客主页: 【小扳_-CSDN博客】**
❤感谢大家点赞👍收藏⭐评论✍**

1.0 事务的概述

    **在数据库管理系统中,事务是确保数据完整性和一致性的重要机制,通过事务的管理可以有效地处理并发操作、故障恢复等问题。**

** 用简单通俗的话来说,将多条 SQL 语句打包在一起并作为一个逻辑单元执行,可以构成一个事务,如果某一条语句出现错误,则进行回滚操作,最终可以使得数据回复到原来的样子;如果 “打包” 在一起的语句都没有出现错误,则进行提交操作,数据就会进行相应的变化并保持持久性。**

语法结构:

-- 开始事务
start transaction;

-- 事务回滚
rollback;

-- 事务提交
commit;

举个例子:

START TRANSACTION;

UPDATE table1 SET column1 = value1 WHERE condition1;
INSERT INTO table2 (column1, column2) VALUES (value1, value2);

COMMIT;
    **在以上例子中,UPDATE 和 INSERT INTO 语句被包含在同一个事务中。如果这些 SQL 都可以执行成功,事务被提交;如果其中的某一条失败,整个事务将被回滚。**

2.0 事务的特性

    **事务具有四个特性,通常被称为 ACID 特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。**

** 是数据库管理系统中保证数据操作正确性和可靠性的基础。通过事务的管理,可以避免数据丢失、数据不一致等问题,保证数据库操作的安全性和可靠性。**

2.1 原子性

    **事务是一个不可分割的工作单位,将多条 SQL 语句打包在一起形成一个事务,要么一起执行成功,要么一条都不执行。如果全部语句执行成功,通过 commit 提交;如果事务中某一条语句执行失败,通过 rollback 回滚,整个事务将被回滚到初始状态。**

2.2 一致性

    **执行事务前和执行事务完毕后,数据是一致性的,不会出现 “对不上” 的情况。如果事务发生回滚,执行事务前后的数据是一致的;如果事务顺利执行,执行事务前与执行事务后的数据一定能对的上。**

2.3 持久性

    **一旦事务提交成功,其所做的操作将永久保存在数据库中(磁盘)。即使系统发生故障或重启,数据也不会丢失。数据一定存储在硬盘中。**

2.4 隔离性

    **多个事务同时执行时,每个事务的操作与其他事务相互隔离,互不打扰。**

** 数据库中并发执行事务时,产生的一些情况:脏读问题、不可重复读问题、幻读问题。**

2.4.1 脏读问题

     **脏读指一个事务读取了另一个事务未提交的数据,即读取到了未提交的数据,如果另一个事务回滚,读取的数据就是无效的。**

脏读的具体情况:

    **在并发执行事务中,假设事务 A 与事务 B 对同一份数据进行操作时,事务 A ,事务 B 同时进行对数据的操作,很有可能会遇到这样的问题:当事务 B 读到 data 数据之后,凑巧事务 A 在事务 B 读完该数据 data 后,将 data 改为 datas 。这种情况就是事务 B 读到了脏数据。 需要重点注意的是:事务 B 读取的是事务 A 未提交的数据。  **

举个例子:​

​​​​​​

解决办法:

    **在事务  A 进行写操作的时候,事务 B 不应该再去读取事务 A 正在操作的数据。因此,引入上锁之后,执行 A 的过程中,B 就不能执行了,要等待。简单来说:加上写锁后,在写操作过程中,是不允许其他事务来读取正在操作的数据。**

** 这就相当于降低了 '并发能力',也就降低数据库服务器的处理效率,提高了 '隔离性' ,也提高了数据的准确性。并发执行事务过程中,相互之间是如何影响的,彼此的影响越小,隔离性越高;反之影响越大,隔离性越低。**

2.4.2 不可重复读问题

   **一个事务先后读取同一个数据 ,但两次读取的数据不同,称之为不可重复读。**

** 在执行并发事务时,假设事务 A 在第一次读取的数据 data ,凑巧事务 B 将 data 改为 data2 并且成功提交了。当事务 A 第二次读取的数据 data2 时,发现与之前的 data 不是同一个数据。需要注意的是:第二次读取的是事务 B 已经提交的数据。这就是不可重复读。**

举个例子:

解决方法:

** 在事务 A 进行读取操作的时候,不能让事务 B 进行写操作。加上读锁后,读数据的时候,不能修改数据。这就可以保证事务 A 前后两次读取的数据都是一致的。**

** 加上读锁后,也会降低数据库服务器的并发能力,提高了隔离性,让数据的准确性大大提升。**

读藏与不可重读的区别:

** 1)主要区别在于脏读是读取了未提交的数据,而不可重复读是读取了已提交的数据,但在读取过程中数据被其他事务修改了。**

** 2)脏读可能会导致读取到无效数据,而不可重复读可能会导致读取到不一致的数据。**

2.4.3 幻读问题

    **也是数据库事务并发控制中的一个问题,指在一个事务内多次查询同一个范围的数据,但在查询过程中,其他事务插入了新的数据,导致多次查询结果不一致的情况。**

** 在执行并发操作时,事务 A ​在某个范围内执行查询操作,获取了一些数据行。在事务 A 执行期间,事务 B ​在同样的范围内插入了新的数据行。事务 A 再次执行相同的查询操作,发现范围内出现了新的数据行,导致查询结果不一致。**

** 事务 A 先后两次得到的结果集不同。**

举个例子:

解决办法:

** “串行化”使所有的事务都严格的按照“一个接一个”的方式执行,完全没有并发了,此时执行效率是最低的,隔离性也是最高的,数据也是最准确的。**

幻读与不可重复读的区别:

** 1)不可重复读是指在事务中多次读取同一行数据时,其他事务修改了该行数据,导致读取结果不一致。**

** 2)幻读是指在事务中多次查询同一范围的数据时,其他事务插入了新的数据,导致查询结果不一致。**

3.0 事务的四个隔离级别

** MySQL 给程序员提供了四个隔离级别,可以在 MySQL 配置文件中进行设置:**

** 3.1 read uncommitted**

** 允许读取其他事务未提交的数据。**

** 存在脏读、不可重复读、幻读情况,此时的并发效率是最高的,隔离性最低。**

** 3.2 read committed**

** 只能允许读取其他事务提交后的数据。**

** 存在不可重复读、幻读情况,并发效率降低,隔离性提高。**

** 3.3 repeatable read**

** 针对读操作与写操作都加锁了。**

** 存在幻读情况,并发效率继续降低,隔离性提高。**

** 3.4 串行化**

** 所有事务都是串行执行的。**

** 此时不存在以上三种情况了,完全解决。但是并发基本没有了,隔离性最高。**

标签: mysql 数据库 sql

本文转载自: https://blog.csdn.net/Tingfeng__/article/details/136710969
版权归原作者 小扳 所有, 如有侵权,请联系我们删除。

“MySQL 篇-深入了解事务四大特性及原理”的评论:

还没有评论