🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍
文章目录
1.0 事务的概述
2.0 事务的特性
2.1 原子性
2.2 一致性
2.3 持久性
2.4 隔离性
2.4.1 脏读问题
2.4.2 不可重复读问题
2.4.3 幻读问题
3.0 事务的四个隔离级别
3.1 read un***mitted
3.2 read ***mitted
3.3 repeatable read
3.4 串行化
1.0 事务的概述
在数据库管理系统中,事务是确保数据完整性和一致性的重要机制,通过事务的管理可以有效地处理并发操作、故障恢复等问题。
用简单通俗的话来说,将多条 sql 语句打包在一起并作为一个逻辑单元执行,可以构成一个事务,如果某一条语句出现错误,则进行回滚操作,最终可以使得数据回复到原来的样子;如果 “打包” 在一起的语句都没有出现错误,则进行提交操作,数据就会进行相应的变化并保持持久性。
语法结构:
-- 开始事务 start transaction; -- 事务回滚 rollback; -- 事务提交 ***mit;
举个例子:
START TRANSACTION; UPDATE table1 SET column1 = value1 WHERE condition1; INSERT INTO table2 (column1, column2) VALUES (value1, value2); ***MIT;
在以上例子中,UPDATE 和 INSERT INTO 语句被包含在同一个事务中。如果这些 SQL 都可以执行成功,事务被提交;如果其中的某一条失败,整个事务将被回滚。
2.0 事务的特性
事务具有四个特性,通常被称为 ACID 特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
是数据库管理系统中保证数据操作正确性和可靠性的基础。通过事务的管理,可以避免数据丢失、数据不一致等问题,保证数据库操作的安全性和可靠性。
2.1 原子性
事务是一个不可分割的工作单位,将多条 SQL 语句打包在一起形成一个事务,要么一起执行成功,要么一条都不执行。如果全部语句执行成功,通过 ***mit 提交;如果事务中某一条语句执行失败,通过 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 un***mitted
允许读取其他事务未提交的数据。
存在脏读、不可重复读、幻读情况,此时的并发效率是最高的,隔离性最低。
3.2 read ***mitted
只能允许读取其他事务提交后的数据。
存在不可重复读、幻读情况,并发效率降低,隔离性提高。
3.3 repeatable read
针对读操作与写操作都加锁了。
存在幻读情况,并发效率继续降低,隔离性提高。
3.4 串行化
所有事务都是串行执行的。
此时不存在以上三种情况了,完全解决。但是并发基本没有了,隔离性最高。