Mysql的架构和历史(二)

本文深入解析MySQL中的事务概念,包括其核心特性如原子性、一致性、隔离性和持久性,以及不同隔离级别下的行为差异。此外还介绍了死锁处理、事务日志机制及InnoDB存储引擎中的多版本并发控制。

Mysql的架构和历史(二)

事务
  • 事务的概述

    简单来说事务就是一个或者多个SQL所组成的一个原子化操作,他们的执行必须具有一致性的,所谓一致性就是指的是这一组操作必须全部成功或者全部失败,他们不存在部分成功部分失败的情况;一个经典里例子A从账户里转账200到B账户里,这里操作我们分解一下,主要分为三个操作

    1. 查询A账户余额是否超过200
    2. 从A账户从减去200
    3. 在B账户中加上200

    以上这三个操作必须作为一个转账的整体而存在,必须全部成功,或者全部失败,要不然会发生不可预测的业务风险。

    我们可以从上述业务操作提取出关于事务的一些性质

    • 原子性(atomicity)一个事务要不全部成功,要不全部失败,整个事务是一个不可分割整体。
    • 一致性(consistency)数据库总是从一个一致的状态到另一个一致的状态。比如说AB转账的操作,在第3个操作出现了问题,那么整个事务都会回滚,不会出现AB账户出现账户不一致的情况。
    • 隔离性(isolation)通常来说一个事务在最终提交前,对于其他事务都是不可见的,这就是隔离性;然而关于隔离性有一个隔离级别的概念。
    • 持久性(durability)事务一旦提交那么所进行的操作就会永久的保存在数据库里。
  • 隔离级别

    SQL标准定义了四种隔离级别

    1. READ UNCOMMITTED(未提交读):在这个级别中所有事务可以读取到当前事务对数据所正在进行的修改操作。
    2. READ COMMITTED(提交读):该级别,所有事务只能读取到事务提交之后的数据只要事务没有提交的话,那么其他事务是不可见的,这个级别也叫作不可重复读(nonrepeatable read)。
    3. REPEATABLE READ(可重复读):这个级别中解决了脏读的问题,保证了同一事物中多次读取相同的记录结果是一致的。但是同时出现了另一个问题,就是幻读(所谓幻读就是在读取某一指定方位内的数据,另一个事务在新增操作,而恰好在该事物读取数据范围内,那么就出现了幻行的情况)。innoDB存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决幻读问题。
    4. SERIALIZABLE(可串行化):该级别为最高隔离级别,所有事务都必须串行化提交,那么也就避免了脏读,幻读等问题,但是效率不高。
  • 死锁

    死锁指的是:两个或者多个事务在同一资源上相互占用,并请求锁定对方所占用的资源,从而导致恶性循环的现象;在使用innoDB作为存储引擎的时候,他会检测当前是否有死锁的循环依赖,一旦出现,解决方案是将持有最少行的排他锁进行回滚。

  • 事务日志

    事务主要是提高事务的效率,使用追加的形式通过从内存中的修改数据通过日志的记录形式先持久化到事务日志中,然后通过读取事务日志的记录再次同步到磁盘中,这种方式称之为预写式日志;一个修改数据通过是需要对磁盘进行修改两次。

  • MySQL中的事务

    • 自动提交(AUTOCOMMIT)

      查询数据库是否采用自动提交的模式:SHOW VARIABLES LIKE ‘AUTOCOMMIT’;NO为自动提交,OFF为手动

    • 在事务中混合使用存储引擎

      作为事务来说,它本身是由存储引擎来管理实现的,比如说两张不同的表分别使用不同的存储引擎,他们之间来实现事务的实现的是不可靠的,假如事务没有回滚的操作,直接执行下去,一般来说是存在问题,一旦事务发生了回滚的操作,那么该事务撤销的执行结果的是无法预测。

    • 隐式和显式锁定

      做innoDB来说采用的是两阶段锁定协议(two-phase locking protocol)。在事务执行过程中随时可以进行锁定,作为锁来说只有在执行COMMIT和ROLLBACK的时候才会释放,并且所有的锁都会在这个时候释放;这里所描述的锁就是隐式锁定,对于innoDB来说会根据具体的隔离级别在需要加锁的时候自动那个加锁。

      当然显示锁定是在MySQL服务器层来实现的,与具体的存储引擎是无关的,对于显示的加锁来说,可能严重影响执行sql的效率。

多版本并发控制
  • MVCC概述

    MVCC可以认为是一个行级锁的变种,但是他在很多情况下是可以避免加锁操作,因此开销更低,同时作为写操作来说也只是锁定必要的行。

  • MVCC在innoDB中实现简述

    MVCC在实现是不同的,典型的实现有乐观并发控制和悲观并发控制

    InnoDB的MVCC,是通过在每行记录的后面保存两个隐藏的列来实现。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或者删除时间);当然存储的并不是一个实际的时间值,而是系统的版本号(system version number)。没开始一个事务的时候,系统版本号会自动递增;事务开始时刻的系统版本号最为当前事务的版本号。

    有一点需要主要,作为MVCC只在READ COMMITED和REPEATED READ 两个级别下工作

MySQL的内存引擎
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值