一、名词解析:
RDBMS::Rational Database Management System 即关系型数据库管理系统
MVCC:Multi-version Concurrency control 多版本并发控制协议
Mysql Innodb存储引擎用的就是--MVCC
MVCC最大的优点:读不加锁,读写不冲突 几乎所有的RDBMS都支持MVCC
二、MVCC
MVCC并发控制中,【读】分为两类:
1、【快照读】:读取的是记录的可见版本(也许是历史版本),不加锁;
操作:select
2、【当前读】:读取记录的最新版本,加锁,(保证其他事务不会并发修改这条记录)
操作:delete
insert
update
锁:S ----- 共享锁
X ----- 排它锁
******************************************************************************************************************************************************************
update/insert/delete操作在数据库中执行的流程:
用户发起一条update操作-------------》发送给mysql server------------》根据where条件找到第一条满足条件的记录
--------------》Innodb将第一条记录返回,并加锁【Current Read当前读】-------------------》mysql server收到这条加锁的记录之后,再发起一条请求,更新这条记录
如此往复,可见对于【当前读】的sql语句,mysql server是一条条进行的,逐条加锁,直到完成为止
******************************************************************************************************************************************************************
三、聚簇索引:Cluster Index
聚簇索引表:这是innodb存储引擎的数据组织方式
聚簇索引的顺序就是数据的物理存储顺序
【为什么索引查找数据较快?
SQL Server的最小空间分配单元是“页(Page)”,一个页在磁盘上占用8K空间,相比于存储数据来说,存储索引更省空间
比如:一个表有8000条数据,
一条数据占1000字节,那么磁盘上一页可以存8条数据,这些数据要存1000页,如果没有索引的话,要在1000个页面内中寻找要找的某一条数据;
在其中的一个10字节的字段上建索引,那么每条记录对应的索引块的大小为10字节,那么磁盘上一页可以存800条索引,只要存10页,那么要寻找某条数据的时候,只要寻找这10个页面即可找到结果,大大节省了I/O
-----------上述说法有待求证,暂不予采纳】
四、隔离级别
以下为引用:http://www.cnblogs.com/zhaoyl/p/4121010.html
MySQL/InnoDB定义的4种隔离级别:
-
Read Uncommited
可以读取未提交记录。此隔离级别,不会使用,忽略。
-
Read Committed (RC)
快照读忽略,本文不考虑。
针对当前读,RC隔离级别保证对读取到的记录加锁 (记录锁),存在幻读现象。
-
Repeatable Read (RR)
快照读忽略,本文不考虑。
针对当前读,RR隔离级别保证对读取到的记录加锁 (记录锁),同时保证对读取的范围加锁,新的满足查询条件的记录不能够插入 (间隙锁),不存在幻读现象。
-
Serializable
从MVCC并发控制退化为基于锁的并发控制。不区别快照读与当前读,所有的读操作均为当前读,读加读锁 (S锁),写加写锁 (X锁)。
Serializable隔离级别下,读写冲突,因此并发度急剧下降,在MySQL/InnoDB下不建议使用。
详细见:http://www.cnblogs.com/zhaoyl/p/4121010.html