加锁
a
多版本并发控制原理分析 之 隐式字段
(1) DB_TRX_ID
a. 占用6byte
b. 记录了创建这条记录时, 最近一次创建或修改该记录的事务id
(2) DB_ROLL_PTR
a. 占用7byte, 回滚指针
b. 指向这条记录的上一个版本(存储于rollback segment回滚段里)
(3) DB_ROW_ID
a. 6byte, 隐含的自增ID(隐藏主键)
b. 如果数据表没有主键, Innodb会自动以DB_ROW_ID产生一个聚簇索引.
(4) 创建版本号
记录了创建事务时的版本号
(5) 删除版本号
记录了删除事务时的版本号
隐式字段填充过程:
(1) 初始化数据:
DB_TRX_ID : NULL, DB_ROLL_PTR : NULL, DB_ROW_ID : 1
此时没有事务, 所以前两个为null, row_id会自增填充.
属于历史记录, 存储在undo log里
(2) 事务1 (假如修改了某字段值):
DB_TRX_ID : 1, DB_ROLL_PTR : 指针, DB_ROW_ID : 1
开启了事务, 所以回滚指针指向了上一个版本的记录.
(3) 事务2:
第二个事务, DB_TRX_ID会变为最近一次的事务id, 即从1变为2. 指针指向了事务1的版本.
1. 事务隔离级别
(1) read uncommitted (读未提交) 导致: 脏读, 不可重复读, 幻读
(2) read committed (读已提交) 导致: 不可重复读, 幻读
(3) repeatable read (重复读) 导致: 幻读(MVCC, next-key-lock解决幻读)
(4) serialiable (串行化)
1.1 脏读:
(1) 当前事务读取到了并行的其他事务修改的数据, 这些数据还没有提交.
(2) 也就是在并行事务的场景下, 不同事务之间对于数据的修改相互可见.
(3) 这样读取到的数据可能就是个脏数据, 因为那个数据可能还没提交或者在回滚, 所以读到的数据不是最终确认的数据.
1.2 不可重复读:
(1) 在不同事务之间, 并行的事务进行读取数据, 这一行的数据读取到的值有可能在其他并行事务中被修改.
(2) 修改之后的值有可能已经把这个值改变了. 改变之后, 事务进行的提交或者回滚, 再在当前事务里对该数据进行读取, 可能读取到的值会发生变化.
(3) 这样前后两次读取到的值就是不相同了, 这就是不可重复读.
1.3 幻读:
(1) 在同一个事务中前后两次读取到的数据条数不相同. 其他事务可能进行了一个插入操作.
(2) 进行插入的数据, 有可能会影响到当前事务的业务逻辑. 读取到的数据行数不一样.
(3) 读取到的数据像是幻影, 即幻读.
哈哈哈哈哈哈哈哈哈哈
select @@global.tx_isolation; // 系统隔离级别
select @@tx_isolation; //会话隔离级别
mysql hide field
mysql log
如何查看SQL语句是否走了索引(explain)?上图所示
联合索引最左原则
区分度低的字段不适合建索引
联合索引字段个数不宜太多,充分权衡插入删除操作及DBA操作表成本
索引组合索引、少用单列索引
where, on, group by, order by 后面跟着字段创建索引
创建了索引,不代表就走了索引
mysql多版本并发控制原理
教学目标
1、摆脱增删改查
2、mvcc原理是什么
3、介绍数据库的一些坑
学习路线及重点
1、事务隔离级别-种类、查看、设置、选择、关联
2、通过现象引发思考-并发事务不同隔离级别的效果
3、多版本并发控制原理
4、mysql总结
MySQL数据库 多版本并发控制 增删改查程序员
MVCC原理的一些问题
数据库的坑
学习路线与学习重点
通过现象引发思考 并发事务不同隔离级别的效果
多版本并发控制原理
mysql经验总结
可重复读级别,在首次快照读时生成读视图
读已提交级别,在每次快照读时生成读视图
索引
事务
MySQL
多版本并发控制
数据可见性算法
读视图
读视图
SELECT FOR UPDATE
隐式字段
聚簇索引
串行化
选择隔离级别
查看 MySQL 事务隔离级别
设置 MySQL 事务隔离级别
MySQL事务隔离级别
读未提交
读已提交
可重复读
串行化
章节学习目录
MySQL