MySQL -- 13 -- MySQL事务的四个特性以及四个隔离级别

原文链接:MySQL – 13 – MySQL事务的四个特性以及四个隔离级别


相关文章:


事务是指作为单个逻辑工作单元执行的一系列操作,要么全部执行,要么全部不执行


一、事务的四个特性 (ACID)

  • 原子性 (Atomic)

    • 事务包含的所有操作,要么全部执行,要么全部不执行
  • 一致性 (Consistency)

    • 事务应确保数据库的状态从一个一致状态转换到另一个一致状态

    • 如:拿转账来说,假设用户 A 和用户 B,两者的钱加起来一共是 2000 元,那么不管 A 和 B 之间如何转账,转几次账,事务结束后,两个用户的钱相加起来应该还为 2000 元,这就是事务的一致性

  • 隔离性 (Isolation)

    • 多个事务并发执行时,一个事务的执行不会影响其他事务的执行,各个事务之间互不干扰
  • 持久性 (Durability)

    • 一个事务一旦被提交,其对数据库的修改就会永久保存在数据库中,即使数据库发生故障,也不会对数据产生任何影响

二、事务并发访问引起的问题

  • 更新丢失

    • 一个事务的更新覆盖了另一个事务的更新

    • MySQL 所有事务隔离级别在数据库层面上均可避免

  • 脏读

    • 当事务 A 正在访问某个数据,并对其进行了修改但并未提交,此时事务 B 也访问了该数据,但读取到的是事务 A 尚未提交的数据,此为脏读
  • 不可重复读

    • 当事务 A 多次读取某个数据期间,事务 B 也访问了该数据,并对其进行了修改并提交,那么由于事务 B 的修改会导致事务 A 前后两次读取到的数据内容不一致,此为不可重复读

    • 侧重于对数据的修改

  • 幻读

    • 当事务 A 多次读取某个数据期间,事务 B 也访问了该数据,并对其进行了添加 / 删除并提交,那么由于事务 B 的添加 / 删除会导致事务 A 前后两次读取到的数据数量不一致,此为幻读

    • 侧重于对数据的添加 / 修改

  • PS:不可重复读和幻读的区别

    • 不可重复读

      • 侧重于对数据的修改,如:多次读取某数据时,发现某些列的值被修改
    • 幻读

      • 侧重于对数据的添加 / 修改,如:多次读取某数据时,发现数据的数量增加或减少了

三、事务的四个隔离级别

  • 读未提交 (Read Uncommitted)

    • 最低的隔离级别,允许事务读取其他事务尚未提交的数据

    • 可能会出现脏读、不可重复读、幻读

  • 读提交 (Read Committed)

    • 允许事务读取其他事务已经提交的数据

    • 避免了脏读,但可能会出现不可重复读、幻读

    • 是 Oracle 的默认隔离级别

  • 可重复读 (Repeatable Read)

    • 事务对于某个数据的多次读取结果都是一致的

    • 避免了脏读、不可重复读,但可能会出现幻读

    • 是 MySQL (InnoDB 存储引擎) 的默认隔离级别

  • 串行化 (Serializable)

    • 最高的隔离级别,完全遵循 ACID 的原则,所有事务依次执行,各个事务之间互不干扰

    • 避免了脏读、不可重复读、幻读

  • PS:如何查看、设置事务的隔离级别

    • 查看事务隔离级别

      版本SQL
      MySQL8.0 之前select @@tx_isolation;
      MySQL8.0 开始SELECT @@transaction_isolation;
    • 设置事务隔离级别

      隔离级别SQL
      设置为读未提交set session transaction isolation level read uncommitted;
      设置为读提交set session transaction isolation level read committed;
      设置为可重复读set session transaction isolation level repeatable read;
      设置为串行化set session transaction isolation level serializable;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值