1.MySQL的架构与历史

2020-07-18  本文已影响0人  SAikeilee

MySQL逻辑架构

image

并发控制

事务

一组原子性的SQL查询,或者说一个独立的工作单元。

ACID

银行通常是解释事务必要性的一个例子。假设一个银行的数据系统有两张表checking支票表和saving储蓄表,现在要从用户Jane的支票账户转200美元到她的储蓄账户,至少需要三个步骤:

  1. 检查支票账户余额高于200美元
  2. 从支票账户余额中减少200美元
  3. 在储蓄账户中增加200美元

三个步骤必须包含在一个事务中,任何一个步骤失败都会回滚所有的步骤

START TRANSACTION;
SELECT ...
UPDATE ...
UPDATE ...
COMMIT;

选择非事务型的引擎,可以获得更高的性能,即使存储引擎不支持事务,也可以通过LOCK TABLES语句为Application提供一定程序的保护。

隔离级别

image-20200718142236818

死锁

两个或多个事务在同一资源上互相占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。

例子:

两个事务同时对StockPrice表操作,即使InnoDB存在RowLock

image-20200718142645299

InnoDB在检测到死锁的循环依赖,会立即返回一个错误。

锁的行为和顺序跟存储引擎有关,相同的语句在不同的引擎不同

双重原因:

  1. 数据冲突
  2. 存储引擎的实现方式

死锁发生后,只有部分或者完全回滚其中一个事务,才能打破死锁。事务型系统是无法避免,所以application设计时候必须考虑如何处理死锁,大多数情况下只需要重新执行死锁回滚的事务即可。

事务日志

事务日志能够提高事务的效率,采用WAL write ahead logging,先写事务日志,再刷盘。

事务日志是顺序写的,也就是append-only,实际上有研究表明,顺序写磁盘有可能会比内存随机读写更快。

具有crash-safe能力。

MySQL中的事务

支持事务的引擎:InnoDB和NDB cluster,第三方的XtraDB和PBXT。

自动提交AUTO COMMIT

MySQL默认采用自动提交,如果不是显式开启一个事务,每个查询都会被当作一个事务执行提交操作。

当前连接中,通过设置AUTO COMMIT变量来启用或禁用“自动提交”:

show variables like 'AUTOCOMMIT';
SET AUTOCOMMIT = 1;

注意事项:

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

MySQL的Server不管理事务,存储引擎去管。所以,不要在同一个事务中使用多个存储引擎。

如果混用了事务型和非事务型,在正常提交的状况不会有问题。

但如果需要回滚,非事务型的表上的变更就无法撤销,导致数据处于不一致的数据状态。

而且在非事务型的表上执行事务相关操作,MySQL通常不会发提醒,也不会报错,回滚时候可能会发警告。

隐式和显式锁定

InnoDB采用的是两阶段锁定协议(two phase locking protocol),事务执行过程随时可以执行锁定,但是解锁会在commit或者rollback同一时刻释放。InnoDB会根据隔离级别在需要情况下隐式锁定。

InnoDB支持显式锁定

SELECT ... LOCK IN SHARE MODE
SELECT ... FOR UPDATE   

MySQL也支持LOCK TABLES 和UNLOCK TABLES,但是在SERVER层实现的,不能替代性能。

如果从MyISAM迁移到InnoDB就不要再使用LOCK TABLES,严重影响性能

多版本并发控制MVCC

MySQL大多数的事务型引擎都不是简单的行级锁,一般实现MVCC

MVCC可认为是行级锁的变种,很多情况避免了加锁,提高并发性能。

MVCC实现,通过保存数据在某一个时间点的快照来实现。不管事务执行多长时间,每个事务看到的数据都是一致的。

不同存储引擎的MVCC实现会不一样,典型有乐观optimistic并发控制还有悲观pessimistic并发控制。

InnoDB的实现:

SELECT:

INSERT:

DELETE:

UPDATE:

优点:提高了性能

缺点:增大了存储

MySQL的存储引擎

上一篇下一篇

猜你喜欢

热点阅读