MySQL架构

MySQL架构

  • MySQL逻辑架构
    • 逻辑架构图 mysql服务器逻辑架构图
    • 第一层:连接处理、授权认证、安全等等
    • 第二层:核心服务功能如查询解析、分析、优化、缓存、所有的内置函数(日期、时间、数学、加密函数等),所有跨存储引擎功能:存储过程、触发器、视图等
    • 第三层:存储引擎。mysql数据的存储和提取
  • 并发控制
    • 读写锁
      • 共享锁(读锁):相互不阻塞
      • 排它锁(写锁):写锁阻塞其他的写锁和读锁
    • 锁粒度
      • 表锁:开销最小,锁定整张表
      • 行级锁:最大程度地支持并发处理,也带来了最大的锁开销
  • 事务
    • 四大特性(ACID)
      • 原子性(atomicity)
        一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚
      • 一致性(consistency)
        数据库总是从一个一致性的状态转换到另外一个一致性的状态
      • 隔离性(isolation)
        一个事务所做的修改在最终提交以前,对其他事务是不可见的
      • 持久性(durability)
        一旦事务提交,则其所做的修改就会永久保存到数据库中
    • 四种隔离级别
      • 未提交读(READ UNCOMMITTED)
        事务可以读取未提交的数据,也被称为脏读
      • 提交读(READ COMMITTED)
        只能“看到”已提交的事务所做的修改,符合隔离性,也叫做不可重复读(两次执行同样的查询,可能会得到不一样的结果)
      • 可重复读(REPEATABLE READ) mysql默认事务隔离级别
        在同一个事务中多次读取同样记录的结果是一致的,解决了脏读,存在幻读
        幻读:当某个事务在读取某个范围内的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围内的记录时,会产生幻行。
        InnoDB存储引擎通过多版本并发控制(MVCC)解决了幻读问题
      • 可串行化(SERIALIZABLE)
        最高隔离级别,强制事务串行执行,读取的每一行数据上都加锁
      • 总结
        隔离级别汇总
    • 死锁
      • 两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环现象
      • 多个事务以不同的顺序锁定资源或者同时锁定同一个资源时,可能会产生死锁
      • 解决
        • 提供死锁检测和死锁超时机制
        • InnoDB存储引擎处理死锁的方法:将持有最少行级排他锁的事务进行回滚
    • MySQL中的事务
      • MySQL提供了两种事务型的存储引擎:InnoDB和NDB Cluster
      • 自动提交(AUTOCOMMIT)
        • MySQL默认采用自动提交模式
        • 查看与修改自动提交模式
        SHOW VARIABLES LIKE 'AUTOCOMMIT'
        SET AUTOCOMMIT=1
        
      • 隐式和显示锁定
        • InnoDB采用的是两阶段锁定协议
        • 隐式锁定
          InnoDB会根据隔离级别在需要的时候自动加锁
        • 显示锁定
          InnoDB支持通过特定的语句进行显示锁定,如LOCK TABLESUNLOCK TABLES
          需要用到事务时,建议选择事务型存储引擎,而非进行显示锁定
  • 多版本并发控制
    • 非阻塞读操作,写操作也只锁定必要的行,开销更低,行级锁的变种
    • 通过保存数据在某个时间点的快照来实现的
    • 乐观并发控制和悲观并发控制
    • InnoDB的MVCC
      • 在每行记录后面保存两个隐藏的列,一个保存行的创建时间,一个保存行的过期时间(或删除时间),存储的并不是实际的时间值,而是系统版本号。没开始一个新的事务,系统版本号都会自动递增
      • SELECT
        • 查找版本早于当前事务版本的数据行
        • 行的删除版本要么未定义,要么大于当前事务版本号
      • INSERT
        为新插入的每一行保存当前系统版本号作为行版本号
      • DELETE
        为删除的每一行保存当前系统版本号作为行删除标识
      • UPDATE
        为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识
      • MVCC只在 可重复读提交读 两个隔离级别下工作
  • MySQL的存储引擎
    待更...

猜你喜欢

转载自my.oschina.net/u/3163032/blog/1806999
今日推荐