🔥博客主页: 【小扳_-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 串行化**
** 所有事务都是串行执行的。**
** 此时不存在以上三种情况了,完全解决。但是并发基本没有了,隔离性最高。**
版权归原作者 小扳 所有, 如有侵权,请联系我们删除。