第一章 MYSQL的架构和历史

在读第一章的过程中,整理出来了一些重要的概念.

锁粒度 

表锁(服务器实现,忽略存储引擎).

行锁(存储引擎实现,服务器没有实现).

事务的ACID概念

原子性(要么全部成功,要么全部回滚).

一致性(从一个一致性状态转换到另外一个一致性状态).

隔离性(一个事务所做的修改在提交前,对其他事务是不可见的).

持久性(一旦事务提交,所有修改都会永久保存到数据库中).

四种隔离级别

READ UNCOMMITTED(未提交读): 事务即使没有提交,所做的修改对其他事务是可见的.  也称脏读.

READ COMMITTED(提交读): 事务没有提交前,所做的任何修改对其他事务是不可见的.这大多数数据库默认的隔离级别,也叫不可重复读.

REPEATABLE READ(可重复读): 当某个事务读取某个范围内记录时,另外一个事务又在该范围内插入了新纪录并且提交成功,这时前一个事务再次读取该范围内记录,便会产生幻行.

SERIALIIZABLE(可串行化): 通过强制事务串行执行,避免幻读的问题, 也就是在读取的每一行记录上加锁,所以可能导致大量超时和锁争用,实际中很少用这个隔离级别.

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;

设置隔离级别,在下次事务时生效.

死锁

多个事务在同一资源相互占用,并请求锁定对方占用的资源,从而导致恶性循环. 当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁.多个事务同时锁定同一资源,也会产生死锁.

Transaction #1
START TRANSACTION;
UPDATE StockPrice SET close = 45.50 WHERE stock_id = 4 and date = ‘2002-05-01‘;
UPDATE StockPrice SET close = 19.80 WHERE stock_id = 3 and date = ‘2002-05-02‘;
COMMIT;
Transaction #2
START TRANSACTION;
UPDATE StockPrice SET high  = 20.12 WHERE stock_id = 3 and date = ‘2002-05-02‘;
UPDATE StockPrice SET high  = 47.20 WHERE stock_id = 4 and date = ‘2002-05-01‘;
COMMIT

上面两个事务同时执行了第一条语句,更新了一条记录,同时都锁定该条记录,接着事务执行第二条记录,发现被锁定,于是都等待对方释放锁 这时就陷入了死循环.

解决:

当查询等待的时间超过锁等待超时的设定后就会放弃锁请求.

InnoDB处理: 将持有最少行级排他锁进行回滚.

自动提交

默认采用自动提交(AUTOCOMMIT), 如果不显示开始一个事务,则每次查询都被当作一个事务执行提交操

SHOW VARIABLES LIKE ‘AUTOCOMMIT‘

1或者ON表示启用,0或者OFF表示禁用

SET AUTOCOMMIT = 1;   开启自动提交

修改AUTOCOMMIT对非事务型的表,比如MYISAM或者内存表没有任何影响.

同一事务中使用多种存储引擎(InnoDB和MYISAM)不可靠,正常情况下不会有什么问题,但如果该事务需要回滚,则非事务型表上的操作不可撤销.

多版本并发控制

MVVC是行级锁的一个变种,但它在很多情况下避免了加锁的操作,因此开销更低.

InnoDB简化版的MVCC:通过在每行记录保存两个隐藏的列,一列保存行的创建时间, 一列保存行的过期时间(删除时间)  当然不是实际时间,而是系统版本号. 每次开始一个事务,系统版本号就会递增, 事务开始时刻的系统版本号作为事务版本号.

SELECT

  a. InnoDB只查找版本早于当前事务版本号的数据行(也就是, 行的版本号小于等于事务的系统版本号), 这样保证事务读取的行,要么是在事务开始就已经存在,要么是事务自身插入或修改过的.

  B.行的删除版本要么未定义,要么大于事务版本号,这样确保事务读取的行在事务之前没有被删除。

  只有符合这两个条件的记录,才能作为查询结果.  

INSERT

  InnoDB为新插入的每一行记录保存当前版本号作为行版本号.

DELETE

  InnoDB为删除的每一行保存当前系统版本号作为删除标识.

UPDATE

  InnoDB为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识.

只有在REPEATABLE READ 和 READ COMMITED 两个隔离级别工作,其他隔离级别都和MVCC不兼容, 应为READ UNCOMMITTED总是读取最新记录行,不符合当前事务版本的数据行. 而SERIALIIZABLE会为读取到的行加锁.

时间: 2024-10-13 23:28:34

第一章 MYSQL的架构和历史的相关文章

一周学会mysql:第一章mysql简介

mysql是支持众所周知的sql(结构化查询语言)数据库语言的一个关系数据库 数据库是由持久性数据的某些集合组成的,由数据库管理系统管理 数据库专用语言把命令传递给数据库服务器,这种语言叫数据库语言 NULL值:未知的值(空值),部要和0混淆了 主键用来唯一标识表中的一列,表中不可能有2个不同行在他们的主键上具有相同的值,主键必须有个值 候选键:表中包含多个可以作为主键的列,但只有其中一个可以作为主键 替换键:不是表格主键的候选键. 外键:是表中的一列,该列是另外一个表的主键内容的一个子集 一周

第一章 Mysql简介及安装和配置

第一章 Mysql简介及安装和配置 ·    第一节:Mysql简介 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品. 使用 C和 C++编写的. 集群(Cluster),适合大规模应用 ·   第二节:Mysql安装及配置 MySql安装注意一次行安装成功,不然要处理注册表. 安装选择编码格式为GBK或UTF-8. 安装MySql图形界面(Navica或MySQlog). p.MsoNormal,li.MsoNormal,div.Mso

高性能mysql第一章——架构

第一章 架构 1.1 mysql逻辑架构 mysql服务器逻辑架构图如上图所示. 第一层为连接/线程处理层.每个客户端连接mysql服务器,都会拥有一个线程.服务器会缓存线程,因此无需为每一个连接新建或释放线程.mysql5.5以上的版本还提供了线程池,可以用少量线程服务大量连接.当客户端连接到服务器时,服务器需要对其认证,根据用户名主机名密码等信息,确定客户端是否有查询/更新某个数据库内某张表的权限. 第二层为mysql的核心服务功能层.包括查询解析.分析.优化.缓存以及所有内置函数(日期.时

高性能Mysql(第一章MySQL架构与历史)

逻辑架构 mysql的逻辑架构分为3层, 连接线程处理. 服务器的核心功能,查询解析.分析.优化.缓存以及所有的内至函数. 存储引擎,负责MySQL中数据的存储和提取,每个存储引擎都有它的优势和劣势,服务器通过API与存储引擎进行通信,这些接口屏蔽了不同存储引擎之间的差异. 并发控制 读写锁通常也称为共享锁和排他锁, 读锁是共享的,多个客户在同一时间可以同时读取同一个资源,而互不干扰. 写锁则是排他的,也就是说一个写锁会阻塞其它的写锁和读锁. 锁粒度 表锁是MySQL中的最基本的策略,它会锁定整

高性能MySQL_第一章-MySQL架构和历史

事务:一组原子性的SQL查询.如果数据库能够成功的对数据库应用该组查询的全部语句,那么就执行改组查询:否则所有的语句都不会执行. ACID:原子性(atomocity),一致性(consistency),隔离性(isolation),持久性(durability). 原子性:一个事务必须被视为不可分割的最小执行单元.整个事物的操作要么全部提交成功,要么全部失败回滚,不可能存在只执行了一部分的操作. 一致性:数据库总是从一个一致性的状态转移到另一个一致性的状态.即使中间出现问题,因为事务没有提交,

MySQL之架构与历史(二)

多版本并发控制 MySQL的大多数事务型存储引擎实现的都不是简单的行级锁.基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC).不仅是MySQL,包括Oracle.PostgreSQL等其他数据库系统也都实现了MVCC ,但各自的实现机制不尽相同,因为MVCC没有一个统一的实习标准. 可以认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,因此开销更低.虽然实现机制不同,但大都实现了非阻塞的读操作,写操作也只锁定了必要的行. MVCC的实现,是通过保存数据在某个时

第一章--MySQL数据库介绍及搭建

1. MySQL数据库介绍 1.1 MySQL介绍 MySQL属于传统关系型数据库产品,它开放式的架构使得用户选择性很强,同时社区开发与维护人数众多.其功能稳定,性能卓越,且在遵守GPL协议的前提下,可以免费使用与修改,也为MySQL的推广与使用带来了更多的利好.在MySQL成长与发展过程中,支持的功能逐渐增多,性能也不断提高,对平台的支持也越来越多. MySQL是一种关系型数据库管理系统,关系型数据库的特点是将数据保存在不同的表中,再将这些表放入不同的数据库中,而不是将所有数据统一放在一个大仓

MySQL的架构与历史

MySQL的最主要特性是它的存储引擎架构,这种架构设计将查询处理以及其他系统任务和数据的存储/提取相分离. MySQL最上层服务是一些如连接处理,授权认证,安全等. MySQL的核心服务功能大部分度在第二层架构中.包括查询解析,分析,优化,缓存以及所有的内置函数,所有跨存储引擎的功能都在这一层实现:存储过程,触发器和视图等. 第三层包含了存储引擎.存储引擎负责MySQL中数据的存储和提取.服务器通过API鱼存储引擎进行通信. MySQL会解析查询,并创建内部数据结构(解析树),然后对其进行各种优

MySql的架构和历史

1.1.mysql的逻辑架构 架构为如下: 存储引擎:负责数据的储存和提取,供了几十个API供服务层进行调用.各个存储引擎之间不会进行交互,只是供服务层进行调用.事务控制和锁的管理也是在存储引擎里面进行. 服务层:一个sql过来之后,会在服务层进行解析,建立解析树,调用底层的存储引擎得到各种开销信息和统计信息,进行各种优化,决定表的读取顺序以及选择合适的索引. 1.2  并发控制 1. mysql通过加读锁和写锁来进行并发控制. 2.锁的粒度 表锁      并发程度低,锁的开销小