mysql的mvcc(多版本并发控制)
2016-07-10 21:45
1036 查看
mysql的mvcc(多版本并发控制)
我们知道,mysql的innodb采用的是行锁,而且采用了多版本并发控制来提高读操作的性能。什么是多版本并发控制呢 ?其实就是在每一行记录的后面增加两个隐藏列,记录创建版本号和删除版本号,
而每一个事务在启动的时候,都有一个唯一的递增的版本号。
1、在插入操作时 : 记录的创建版本号就是事务版本号。
比如我插入一条记录, 事务id 假设是1 ,那么记录如下:也就是说,创建版本号就是事务版本号。
id | name | create version | delete version |
1 | test | 1 |
比如,针对上面那行记录,事务Id为2 要把name字段更新
update table set name= 'new_value' where id=1;
id | name | create version | delete version |
1 | test | 1 | 2 |
1 | new_value | 2 |
delete from table where id=1;
id | name | create version | delete version |
1 | new_value | 2 | 3 |
从上面的描述可以看到,在查询时要符合以下两个条件的记录才能被事务查询出来:
1) 删除版本号 大于 当前事务版本号,就是说删除操作是在当前事务启动之后做的。
2) 创建版本号 小于或者等于 当前事务版本号 ,就是说记录创建是在事务中(等于的情况)或者事务启动之前。
这样就保证了各个事务互不影响。从这里也可以体会到一种提高系统性能的思路,就是:
通过版本号来减少锁的争用。
另外,只有read-committed和 repeatable-read 两种事务隔离级别才能使用mVcc
read-uncommited由于是读到未提交的,所以不存在版本的问题
而serializable 则会对所有读取的行加锁
相关文章推荐
- mysql 主从配置(master slave)
- dos界面操作mysql讲解
- Mysql常见sql
- 如何将 JSON, Text, XML, CSV 数据文件导入 MySQL
- mysql的普通索引,唯一索引,主索引
- MySQL的安装和启动
- mysql半一致性读案例分析
- mysql调试
- SAE MySQL使用例1
- Centos6.5安装mysql不能启动,应该安装mysql-server
- mysql用户名和密码忘记了怎么办?
- navicat for Mysql:2003 can't connect to mysql server on 'localhost'(10038)问题的解决方法
- Mac 重新设置MySQL的root密码
- MySql-半同步复制
- MySql-Undo及Redo详解
- 优化MySQL数据库性能的八大方法
- MYSQL添加新用户 MYSQL为用户创建数据库 MYSQL为新用户分配权限
- MySQL性能优化的最佳20+条经验
- MySql-straight_join优化列
- 修改mysql的字符集和默认存储引擎