🔥博客主页: 【小扳_-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 uncommitted
3.2 read committed
3.3 repeatable read
3.4 串行化
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 串行化
所有事务都是串行执行的。
此时不存在以上三种情况了,完全解决。但是并发基本没有了,隔离性最高。