1. MySQL的结构
在具体介绍MySQL的存储引擎之前,先来介绍一下MySQL的结构。

从图中可以看到MySQL由以下几个部分组成

连接池
管理服务和工具组件
SQL接口
查询分析器
优化器
缓存
插入式存储引擎
物理文件

2. MySQL的存储引擎

这张表列出了MySQL中5种常用的存储引擎以及它们支持的特性。

Feature MyISAM Memory InnoDB Archive NDB
Storage limits 256TB Yes 64TB No 384EB[4]
Transactions No No Yes No Yes
Locking granularity Table Table Row Row Row
MVCC (snapshot read) No No Yes Yes No
Geospatial support Yes No Yes[1] Yes[1] Yes[1]
B-tree indexes Yes Yes Yes No Yes
Hash indexes No Yes No No Yes
Full-text search indexes Yes No No No No
Clustered indexes No No Yes No No
Data caches No N/A Yes No Yes
Index caches Yes N/A Yes No Yes
Compressed data Yes No No Yes No
Encrypted data[2] Yes Yes Yes Yes Yes
Cluster database support No No No No Yes
Replication support[3] Yes Yes Yes Yes Yes
Foreign key support No No Yes No No
Backup / point-in-time recovery[3] Yes Yes Yes Yes Yes
Query cache support Yes Yes Yes Yes Yes
Update statistics for data dictionary Yes Yes Yes Yes Yes

 

 

3. MySQL中的事务
MySQL中,InnoDB和BDB都支持事务处理。
3.1  事务的ACID特性
(1) 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行。
(2) 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。
(3) 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的,反之亦然。
(4) 持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。

 

3.2. 事务处理带来的相关问题
由于事务的并发执行,带来以下一些著名的问题:
(1) 更新丢失(Lost Update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题--最后的更新覆盖了由其他事务所做的更新。
(2) 脏读(Dirty Reads):一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些“脏”数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做"脏读"。
(3) 不可重复读(Non-Repeatable Reads):一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做“不可重复读”。
(4) 幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为“幻读”。

 

3.3. 为了解决上面提到的问题,以及考虑到实际应用的需要,SQL标准定义了事务的隔离性, SQL2标准定义了四个隔离级别。定义语句如下:
SET TRANSACTION ISOLATION LEVEL
[READ UNCOMMITTED |  READ COMMITTED  | REPEATABLE READ  | SERIALIZABLE ]

隔离级

脏读

不可重复读

幻象读

读未提交

(Read uncommitted)

可能

可能

可能

读提交

(Read committed)

不可能

可能

可能

可重复读

(Repeatable read)

不可能

不可能

可能

可串行化

(Serializable)

不可能

不可能

不可能

各个具体数据库并不一定完全实现了上述4个隔离级别,例如

Oracle只提供READ COMMITTED和Serializable两个标准隔离级别,另外还提供自己定义的Read only隔离级别;
SQL Server除支持上述ISO/ANSI SQL92定义的4个隔离级别外,还支持一个叫做“快照”的隔离级别,但严格来说它是一个用MVCC实现的Serializable隔离级别。MySQL 支持全部4个隔离级别,其默认级别为Repeatable read,但在具体实现时,有一些特点,比如在一些隔离级别下是采用MVCC一致性读。
MySQL使用MVCC来获得高并发性,同时使用next-key locking的策略来避免幻读。关于next-key locking后面讲。
国产数据库DM也支持所有级别,其默认级别为READ COMMITTED。

 

参考
MySQL online HTML
MySQL技术内幕 InnoDB存储引擎
http://www.cnblogs.com/hustcat/archive/2009/10/18/1585626.html