MySQL中的变乱(假如想知道MYSQL中有关变乱的知识,那么只看这一篇就足够了 ...

打印 上一主题 下一主题

主题 851|帖子 851|积分 2553

        媒介:变乱管理是数据库确保数据一致性和可靠性的核心机制,通过将一组操作作为一个团体实行,变乱要么完全成功,要么完全失败,避免了数据不一致的问题,在多用户并发情况中,变乱隔离级别决定了不同变乱的交互方式,影响系统的性能和一致性。

   

  ✨✨✨这里是秋刀鱼不做梦的BLOG
  ✨✨✨想要相识更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客
  在正式开始解说之前,先让我们看一下本文大抵的解说内容:

目录
1.变乱的初识
        (1)变乱的概念
        (2)变乱的根本操作
        (3)变乱的回滚与生存点
2.ACID 特性
        (1)原子性(Atomicity)
        (2)一致性(Consistency)
        (3)隔离性(Isolation)
        (4)持久性(Durability)
3.变乱隔离级别
        (1)读未提交
        (2)读已提交
        (3)可重复读
        (4)串行化(SERIALIZABLE)
4.自动提交与手动提交模式
        (1)自动提交模式 
        (2)手动提交模式



1.变乱的初识

        (1)变乱的概念

        在开始学习MySQL中的变乱之前,先让我们来相识一下什么是MySQL中的变乱:
   变乱是将一组 SQL 操作封装为一个团体,确保这些操作要么全都成功,要么全都失败
          变乱的重要应用场景大抵有资金转账、库存扣减等多个步骤组成的操作,保证这些操作可以大概在出现错误时进行回滚,从而确保数据的一致性和完整性。
        通过上述的简短描述,我们就对MySQL中变乱的定义有了初步的相识了,那么接下来让我们进一步相识一下MySQL中的变乱。

        (2)变乱的根本操作

        在 MySQL 中,变乱的控制是通过以下 SQL 语句来实现的:
   

  • START TRANSACTIONBEGIN:开启变乱。
  • COMMIT:提交变乱,将全部更改持久化生存。
  • ROLLBACK:回滚变乱,打消对数据的全部修改。
          例如,考虑一个简单的银行转账操作,假设要从账户 A 扣款 100 元,往账户 B 存款 100 元。我们希望这两个操作要么都成功,要么都失败,若出现任何问题,都应当回滚整个变乱。
  1. START TRANSACTION;
  2. UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;  -- 扣款操作
  3. UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;  -- 存款操作
  4. COMMIT;  -- 提交事务,保存所有更改
复制代码
代码解释:
           首先启动一个变乱,然后实行两条 SQL 语句:从账户 A 扣款 100 元,同时往账户 B 存款 100 元,最后,通过 COMMIT 提交变乱,确保这两个操作成功生存。
          通过上述的案例,我们就大抵的相识了MySQL中的变乱的根本操作了!!!

        (3)变乱的回滚与生存点

        回滚是变乱中的一个重要特性,假如在变乱实行过程中遇到错误,可以通过 ROLLBACK 将全部更改打消,恢复到变乱开始之前的状态,除此之外,MySQL 还支持使用 生存点 来标志变乱中的特定位置,允许在出现错误时仅回滚到某个特定的生存点,而不是完全回滚。
  1. START TRANSACTION;
  2. SAVEPOINT savepoint1;  -- 设置保存点
  3. UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;  
  4. -- 如果发生错误,回滚到保存点
  5. ROLLBACK TO SAVEPOINT savepoint1;
  6. COMMIT;  -- 提交事务
复制代码
代码解释:
           生存点 savepoint1 被设置在变乱开始后,若发生错误,变乱会回滚到此生存点,避免打消整个变乱的全部操作。
          至此,我们就大抵的初识了MySQL中的变乱的内容了!!!

2.ACID 特性

        在学习完了MySQL中的变乱的根本概念之后,在让我们学习一下ACID 特性,ACID 是数据库变乱的核心概念,它代表了四个根本的属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这四个特性确保了变乱的正确性和数据库的稳定性。
        (1)原子性(Atomicity)

        原子性意味着变乱中的全部操作要么全部实行成功,要么全部实行失败,假如变乱中的任何操作失败,整个变乱会被回滚,恢复到变乱开始之前的状态。
例子:
        ——假设我们正在进行一个资金转账操作,假如扣款成功但是存款失败,整个变乱应该回滚,确保资金不会丢失,以下是实现原子性的代码:
  1. START TRANSACTION;
  2. UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;  -- 扣款操作
  3. UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;  -- 存款操作
  4. -- 如果第二个操作失败,整个事务回滚
  5. ROLLBACK;  -- 恢复到事务开始之前的状态
复制代码
代码解释:
           假如存款操作由于某些缘故原由失败,那么变乱会回滚到开始时的状态,确保数据不会处于不一致的状态。
  
        (2)一致性(Consistency)

        一致性意味着变乱必须确保数据库的完整性约束得到服从,变乱实行前后,数据库从一个一致的状态过渡到另一个一致的状态,无论变乱是否成功完成,数据库都应该处于有效的状态。
例子:
        ——在银行转账中,必须保证在扣款和存款操作之间,账户余额的变革始终遵照一定的规则,例如,账户余额不能为负数。
  1. START TRANSACTION;
  2. UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
  3. -- 确保账户余额大于零
  4. IF (SELECT balance FROM accounts WHERE account_id = 1) < 0 THEN
  5.     ROLLBACK;  -- 如果余额不足,回滚事务
  6. END IF;
  7. UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
  8. COMMIT;
复制代码
代码解释:
           在进行扣款操作后,我们查抄账户余额是否足够,假如余额不足,则回滚变乱,否则继承实行存款操作,这样可以确保数据库的一致性。
  
        (3)隔离性(Isolation)

        隔离性保证了变乱的实行不受其他变乱的干扰,即使多个变乱同时实行,它们的操作互不影响,为了实现隔离性,数据库管理系统提供了不同的变乱隔离级别,每个隔离级别在并发性能与数据一致性之间做了不同的衡量。
MySQL 支持四种变乱隔离级别:
   

  • READ UNCOMMITTED(读未提交):变乱可以读取其他变乱未提交的数据,可能会发生脏读。
  • READ COMMITTED(读已提交):变乱只能读取已提交的数据,避免脏读,但仍旧可能发生不可重复读。
  • REPEATABLE READ(可重复读):变乱中的全部查询都能读取到一致的数据,避免了不可重复读。
  • SERIALIZABLE(串行化):变乱按照顺序实行,确保没有并发问题,但性能最低。
  例子:
        ——在 MySQL 中,我们可以设置变乱的隔离级别,以下代码展示了如何设置变乱的隔离级别:
  1. -- 查看当前事务隔离级别
  2. SELECT @@global.tx_isolation;
  3. -- 设置事务隔离级别为 REPEATABLE READ
  4. SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  5. START TRANSACTION;
  6. SELECT balance FROM accounts WHERE account_id = 1;  -- 读取账户余额
  7. COMMIT;
复制代码
代码解释:
           我们设置了变乱的隔离级别为 REPEATABLE READ,这意味着变乱实行过程中,全部的读取操作将看到相同的数据,从而避免了不可重复读的问题。
  
        (4)持久性(Durability)

        持久性确保了变乱一旦提交,对数据的修改将永世写入数据库,即使系统发生瓦解或其他故障,数据也不会丢失。
例子:
  1. START TRANSACTION;
  2. UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
  3. COMMIT;  -- 提交事务,修改会被永久保存
复制代码
代码解释:
           即使在提交后,系统瓦解了,数据库仍旧会从日志文件中恢复到一致状态,确保资金的变动不会丢失。
          这样我们就学习完了MySQL中的.ACID 特性了!!!

3.变乱隔离级别

        接下来在让我们学习一下变乱隔离级别,我们知道,MySQL 使用 InnoDB 存储引擎支持四种变乱隔离级别,分别为:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和 SERIALIZABLE(串行化),这些隔离级别通过锁机制和多版本并发控制(MVCC)来实现,不同的隔离级别会影响数据的一致性和并发性能。

        (1)读未提交

        读未提交是最低的隔离级别,变乱 A 可以读取变乱 B 中尚未提交的数据,由于变乱 A 读取的数据可能是一个未提交的更改,因此会导致所谓的 脏读(Dirty Read)。
   

  • 脏读:变乱 A 在变乱 B 提交前读取了变乱 B 对某个数据的修改,假如变乱 B 回滚,变乱 A 读取到的数据就是无效的。
  • 优点:性能最优,适合对数据一致性要求不高的场景。
  • 缺点:可能导致数据不一致,极易引发逻辑错误。
  例子:
        —— 假设有两个变乱同时进行,一个变乱正在更新数据,而另一个变乱可以读取这个未提交的更新。
  1. -- 事务 A
  2. SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
  3. START TRANSACTION;
  4. UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
  5. -- 事务 B
  6. START TRANSACTION;
  7. SELECT balance FROM accounts WHERE account_id = 1;  -- 读取事务 A 未提交的数据
  8. COMMIT;
复制代码
代码解释:
           变乱 B 读取到了变乱 A 尚未提交的更改。假如变乱 A 最终回滚,变乱 B 读取的数据就是无效的,产生了脏读问题。
  
        (2)读已提交

        读已提交隔离级别解决了脏读问题,确保变乱只能读取已提交的数据。但它仍旧允许在同一个变乱内多次查询返回不同效果,产生 不可重复读(Non-repeatable Read)问题。
   

  • 不可重复读:在同一个变乱中多次读取同一数据,但每次读取的效果不同,因为其他变乱可能已经提交了更改。
  • 优点:避免了脏读,保证了数据的一致性。
  • 缺点:轻易产生不可重复读问题。
  例子:
        ——在 READ COMMITTED 隔离级别下,变乱 A 在同一变乱内的两次查询效果可能不同。
  1. -- 事务 A
  2. SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
  3. START TRANSACTION;
  4. SELECT balance FROM accounts WHERE account_id = 1;  -- 第一次查询
  5. -- 事务 B
  6. START TRANSACTION;
  7. UPDATE accounts SET balance = balance - 50 WHERE account_id = 1;
  8. COMMIT;  -- 事务 B 提交
  9. -- 事务 A
  10. SELECT balance FROM accounts WHERE account_id = 1;  -- 第二次查询,结果不同
  11. COMMIT;
复制代码
代码解释:
           变乱 A 的第二次查询效果与第一次查询的效果不同,因为变乱 B 在变乱 A 的查询之间提交了更改。
  
        (3)可重复读

        可重复读隔离级别解决了不可重复读问题,确保在同一个变乱中,全部的查询操作返回的效果始终一致。InnoDB 存储引擎使用多版本并发控制(MVCC)机制来实现这一点。
   

  • 可重复读:变乱内的全部读取操作,始终返回相同的数据,即使其他变乱修改了这些数据。
  • 幻读:在 REPEATABLE READ 隔离级别下,固然变乱 A 在多次读取中得到相同效果,但在查询过程中,另一个变乱可以插入新的记录,导致变乱 A 查询的范围发生变革,这就是幻读问题。
  • 优点:解决了脏读和不可重复读问题。
  • 缺点:仍旧可能发生幻读。
  例子:
  1. -- 事务 A
  2. SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
  3. START TRANSACTION;
  4. SELECT balance FROM accounts WHERE account_id = 1;  -- 第一次查询
  5. -- 事务 B
  6. START TRANSACTION;
  7. INSERT INTO accounts (account_id, balance) VALUES (3, 100);  -- 事务 B 插入新记录
  8. COMMIT;
  9. -- 事务 A
  10. SELECT balance FROM accounts WHERE account_id = 1;  -- 第二次查询,可能出现幻读问题
  11. COMMIT;
复制代码
代码解释:
           固然变乱 A 中的查询效果始终一致,但假如变乱 B 在变乱 A 实行过程中插入了新的记录,变乱 A 可能会遇到幻读问题,即查询的效果集发生了变革。
  
        (4)串行化(SERIALIZABLE)

        串行化是最严格的变乱隔离级别,全部变乱串行实行,互不干扰。它通过逼迫加锁的方式,确保一个变乱在实行时,其他变乱必须等待直到该变乱完成,这种方式完全解决了全部的并发问题,包括脏读、不可重复读和幻读。
   

  • 优点:完全避免了脏读、不可重复读和幻读问题,确保数据的绝对一致性。
  • 缺点:性能最差,因为变乱必要串行实行,严重影响并发性能。
  例子:
  1. -- 事务 A
  2. SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
  3. START TRANSACTION;
  4. SELECT balance FROM accounts WHERE account_id = 1;  -- 第一次查询
  5. -- 事务 B
  6. START TRANSACTION;
  7. UPDATE accounts SET balance = balance - 50 WHERE account_id = 1;  -- 事务 B 更新数据
  8. COMMIT;
  9. -- 事务 A
  10. SELECT balance FROM accounts WHERE account_id = 1;  -- 第二次查询,结果不会变化
  11. COMMIT;
复制代码
代码解释:
   变乱 A 和变乱 B 会串行实行,变乱 A 在实行期间会被阻塞,直到变乱 B 完成。
          至此我们就相识了MySQL中的变乱隔离级别了!!!

4.自动提交与手动提交模式

        最后在让我们学习一下自动提交与手动提交模式,在 MySQL 中,变乱默认是自动提交的,这意味着每条 SQL 语句实行后都会立刻提交,然而,偶然开发者希望控制变乱的提交过程,这时可以关闭自动提交,手动实行变乱提交。
        (1)自动提交模式 

        ——默认情况下,MySQL 在每个 SQL 语句后都会自动提交变乱,固然我们也可以设置自动提交变乱:
  1. -- 启用自动提交
  2. SET AUTOCOMMIT = 1;
复制代码

        (2)手动提交模式

        在手动提交模式下,变乱不会自动提交,而是必要通过显式的 COMMITROLLBACK 来控制。
  1. -- 禁用自动提交
  2. SET AUTOCOMMIT = 0;
  3. START TRANSACTION;
  4. UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
  5. -- 手动提交事务
  6. COMMIT;
复制代码
        通过手动提交变乱,开发者可以更加精细地控制变乱的实行,确保在复杂操作中的数据一致性。
        以上就是自动提交与手动提交模式的全部内容了!!!


以上就是本篇文章全部内容~~


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表