沫言|解读数据库:深入分析MySQL中事务以及MVCC的实现原理

推荐学习

  • 真真香!耗时大半个月收整全套「Java架构进阶pdf」没白费
  • 全网独家的“MySQL高级知识”集合 , 骨灰级收藏 , 手慢则无
  • 阿里P8MySQL , 基础/索引/锁/日志/调优都不误 , 一锅深扒端给你

沫言|解读数据库:深入分析MySQL中事务以及MVCC的实现原理什么是事务事务(Transaction)是由一系列对数据库中的数据进行访问与更新的操作所组成的一个程序执行单元 。
在同一个事务中所进行的操作 , 要么都成功 , 要么就什么都不做 。 理想中的事务必须满足四大特性 , 这就是大名鼎鼎的ACID 。
事务的ACID特性并不是所有的事务都满足ACID特性 , 比如:对于Oracle和SQL Server数据库 , 其默认隔离级别是Read COMMITTED , 就不满足I(隔离性)的要求;对于MySQL的NDB Cluster引擎来说 , 不满足D(持久性)的要求 。
A(Atomicity)-原子性原子性指的是数据库事务是不可分割的一部分 , 只有一个事务中的所有操作都成功 , 这个事务才算执行成功 , 一旦有一个操作失败 , 那么其他成功的操作也必须回滚 。 以转账1000元场景为例 , 一个转账过程就是一个事务 , 这个事务主要包括以下两步:1、从A账户扣除1000元2、将B账户中增加1000元试想 , 如果第一步成功了 , 那么第二步失败了 , 那就等于A的1000元钱直接消失了 , 相信这是任何人都不能接受的事项 , 所以数据库事务才需要保证原子性 。
C(Consistent)-一致性指的是在事务开始之前和事务结束之后 , 数据库的完整性约束都没有被破坏 , 事务执行的前后都是合法的数据状态 。
比如我们有一张表中有一个字段name建立了一个唯一约束 , 那么当我们进行事务提交或者事务回滚之后 , 这个name必须依然保证唯一 。
I(Isolation)-隔离性隔离性就是说每个事务之间的操作应该相互隔离 , 互不干扰 。 比如说一个事务提交之前对另一个事务不可见 。
隔离是一个相对抽象而复杂的概念 , 比如说事务之间的隔离性我们到底要隔离到哪种程度呢?所以 , 针对隔离 , SQL92标准定义了4种隔离级别 , 这个放在后面事务的隔离级别中介绍 。
D(Durable)-持久性持久性这个概念就比较容易理解了 , 就是说事务一旦提交成功了 , 那么就应该是持久的 , 即使是数据库重启 , 服务器宕机等情况发生 , 数据都不会丢失(当然这个不能包括因为地震等自然灾害导致的存储数据的硬盘损发生不可逆的损坏) 。
事务的管理可能很多人会说自己都感知不到MySQL的事务 , 其实这是因为MySQL事务是默认开启了自动提交的 , 因此 , 如果要感知到事务 , 我们需要关闭自动提交或者显示开启事务 。
事务的自动提交查看自动提交语句:
SHOW VARIABLES LIKE 'autocommit';-- ON表示开启了自动提交SELECT @@autocommit;-- 1表示开启了自动提交执行如下语句关闭自动提交:
SET autocommit='OFF';SET @@autocommit = 0;不过需要注意的是 , 这种修改方式只是在当前会话窗口生效 , 对其他会话窗口是不生效的 , MySQL几乎所有变量设置都会分成两个级别 , session(会话)和global(全局)级别 , 默认就是session级别 。
常用的事务控制语句