MVCC是来处理并发的问题,提高并发的访问效率,读不阻塞写。
事物
A 原子性
C 一致性
I 隔离性
D 持久性
高并发的场景下的问题
脏读
不可重复读
幻读
事物隔离级别
RU读未提交 脏读/不可重复读/幻读 。不适用MVCC读,可以读到其他事务修改甚至未提交的。
RC读已提交 不可重复读/幻读 。其他事务对数据库的修改,只要已经提交,其修改的结果就是可见的,与这两个事务开始的先后顺序无关,不完全适用于MVCC读。
RR可重复读 幻读 。完全适用MVCC,只能读取在它开始之前已经提交的事务对数据库的修改,
在它开始以后,所有其他事务对数据库的修改对它来说均不可见。
S串行化 / 。完全不适合适用MVCC,这样所有的query都会加锁,再它之后的事务都要等待。
Oracle Postgresql 默认RC
MySQL Innodb 默认RR
InnoDB实现MVCC的方法:多版本并发控制
InnoDB实现MVCC的方法是,它存储了每一行的三个额外的隐藏字段。
1.DB_TRX_ID 6byte的标识 每处理一个事务,其值自动+1
创建时间”和“删除时间”记录的就是这个DB_TRX_ID的值
如insert、update、delete操作时用1个bit表示
2.DB_ROLL_PTR: 大小是7byte,指向写到rollback segment(回滚段)的一条undo log记录
(update操作的话,记录update前的ROW值)
3.DB_ROW_ID: 大小是6byte,该值随新行插入单调增加,当由innodb自动产生聚集索引时聚集索引(即没有主键时,因为MYSQL默认聚簇表,会自动生成一个ROWID)
DB_TRX_ID记录了行的创建的时间删除的时间在每个事件发生的时候,每行存储版本号,而不是存储事件实际发生的时间。每次事物的开始这个版本号都会增加。自记录时间开始,每个事物都会保存记录的系统版本号。
a.新增,在insert操作时 “创建时间”=DB_TRX_ID,这时,“删除时间”是未定义的;
b.修改,在update时,复制新增行的“创建时间”=DB_TRX_ID,删除时间未定义,旧数据行“创建时间”不变,删除时间=该事务DB_TRX_ID;
c.删除,delete操作,相应数据行的“创建时间”不变,删除时间=该事务的DB_ROW_ID;
d.查询,select操作对两者都不修改,只读相应的数据;
SELECT
Innodb检查每行数据,确保他们符合两个标准:
1.InnoDB只查找版本早于当前事务版本的数据行(也就是数据行的版本必须小于等于事务的版本),这确保当前事务读取的行都是事务之前已经存在的,或者是由当前事务创建或修改的行。
2.行的删除操作的版本一定是未定义的或者大于当前事务的版本号。确定了当前事务开始之前,行没有被删除 符合了以上两点则返回查询结果。
INSERT
InnoDB为每个新增行记录当前系统版本号作为创建ID。
DELETE
InnoDB为每个删除行的记录当前系统版本号作为行的删除ID。
UPDATE
InnoDB复制了一行。这个新行的版本号使用了系统版本号。它也把系统版本号作为了删除行的版本。

最新文章

  1. DirectX runtime
  2. 10个jQuery小技巧
  3. spring4+hibernate4+maven环境搭建
  4. Java Hour 35 Weather ( 8 ) struts2 – message resource
  5. 注意自己的dns设置 - 阿权的书房
  6. 模糊查询(LIKE)and (PATINDEX() . CHARINDEX())
  7. 浅谈IT认识
  8. 一个卡片式的ViewPager,带你玩转ViewPager的PageTransformer属性!
  9. php中JPGraph入门配置与应用
  10. c#获取新浪微博登录cookie
  11. windows平台把UliPad添加到右键菜单
  12. Out of mind - 魔术纸
  13. 绕过校园网WEB认证_dns2tcp实现
  14. shell ip变量加法运算
  15. mysql中find_in_set的使用
  16. 接口自动化框架(java)--2.接口用例POST请求,参数配置
  17. 如何搭建高可用redis架构?
  18. ext中grid根据数据不同显示不同样式
  19. Selenium操作示例——鼠标悬停显示二级菜单,再点击二级菜单或下拉列表
  20. ELK测试安装

热门文章

  1. thinkphp5 大量数据批量插入数据库的解决办法
  2. 1632:【 例 2】[NOIP2012]同余方程
  3. 爬虫之python3用execjs执行JS代码
  4. HDU 4393 Throw nails(贪心加模拟,追及问题)
  5. pwn学习日记Day13 《程序员的自我修养》读书笔记
  6. 冲刺阶段——Day3
  7. WEB-INF目录下登录表单提交的重定向
  8. Linux rpm 安装MySQL
  9. OpenResty之指令与常用API
  10. Linux-文件系统的简单操作