第一章 Mysql 架构和历史

第一章 Mysql 架构和历史
1.1 Mysql 逻辑架构
Mysql 各组件之间的协同工作架构图 :

Image text

  • 第一层 : 基于网络的客户端/服务器工具.比如:连接处理 授权认证 安全 等等
  • 第二层 : Mysql核心功能区域, 查询解析 分析 优化 缓存 还有函数 存储过程 视图等
  • 第三层 : 存储引擎 负责数据存储和读取 ! 存储引擎 只会简单响应上层服务器的请求 !
1.2 并发控制

只要是多个查询需要在同一时刻修改数据,就会有并发问题 !
Mysql 在 服务器层存储引擎层两个层面的并发控制 !

  • 读写锁
    在处理并发读或者写时,可以通过实现一个由两种锁来解决问题. 通常称为 共享锁(shared lock ) 和 排他锁 (exclusive lock ) ,也叫读锁(read lock) 和 写锁(write lock) .
    读锁 : 是共享的 ,可以同时读取同一个文件 !
    写锁 : 是排他的 ,一个资源在给定的时间内只能有一个用户写入,防止其他用户使用 !
    写锁比读锁有更高的优先级,因此一个写入操作有可能插入到读锁的前面 !
  • 锁粒度
    锁策略: 在锁开销(加锁 , 检查锁 , 释放锁 等操作) 和 数据安全性之间寻求平衡点 , 这种平衡会影响性能 !
    表锁 : 最基本锁策略, 开销最小的锁策略 ! 在一个用户对表进行写入操作时候, 获得表锁 ,其他用户将无法读写 ! 如果没有写锁,读锁之间不会阻塞 !
    行锁 : 最大程度的支持并发 ,开销最大 ! (Mysql 存储引擎 层次实现的 ,服务器层次没有实现 ! 具体实现机制需要看存储引擎 !)
1.3 事务

一个事务: 就是整件事情要不全部成功, 要么全部失败 !
ACID: 原子性(actomicity) , 一致性(consistency) ,隔离性(islation), 持久性(durability) !

  • 隔离级别:
    Read Uncommitted(读取未提交内容)
    在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
    Read Committed(读取提交内容)
    这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
    Repeatable Read(可重读)
    这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题
    Serializable(可串行化)
    这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
  • 死锁
    是指两个或者多个事务在同一个资源上互相占用 , 并请求锁定对象占用的资源。从而导致恶性循环的现象!
    锁的行为和顺序是和存储引擎息息相关 的,以同样的顺序执行语句, 有的存储引擎会产生死锁, 有些则不会!
    死锁的产生有双重原因:有些是因为正真的数据冲突,这种情况通常很难避免。但有些则是存储引擎的实现方式导致的
    死锁以后: 只有部分或者回滚其中一个事务 ! 才能打破死锁 !
  • 事务日志
    事务日志可以帮助事务的效率 。使用事务日志,存储引擎再修改表数据时只需要修改内存拷贝,再把该修改行为记录到持久在硬盘上事务日志中,而不是每次都将修改的数据持久到磁盘中。事务日志采用的是追加方式,因此写日志操作是磁盘上一小块区域内的顺序I/O ,而不像随机I/O需要在磁盘的多个地方移动磁盘,所以采用事务日志的方式相对说要快的多.。事务日志持久化以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘。目前大多数存储引擎都是这样实现的,我们通常称之为预写式日志(write-Ahead logging),修改数据需要两次磁盘!
    如果数据的修改已经记录到事务日志持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启能够自动回复这部分修改的数据.具体回复方式则是视存储引擎而定 !
  • Mysql 中的事务
    Mysql提供两种事务型的存储引擎: InnoDB 和 NDB Cluster ,另外还有一些第三方存储引擎也支持!
    自动提交
    1或者on表示开启 , 0或者OFF 表示关闭 !
SHOW VARIABLES LIKE 'AUTOCOMMIT' ;
Variable_nameValue
autocommitON
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值