赞
踩
目录
①假设测试表结构 :
- mysql> create table if not exists student(
- name varchar(11) not null,
- age int not null
- );
-
- mysql> insert into student (name, age) values ('张三', 28);
- Query OK, 1 row affected (0.05 sec)
-
- mysql> select * from student;
- +--------+-----+
- | name | age |
- +--------+-----+
- | 张三 | 28 |
- +--------+-----+
- 1 row in set (0.00 sec)
②select 描述的意思是:
name | age |
DB_TRX_ID(创建该记录的事务ID)
|
DB_ROW_ID(隐式主键)
|
DB_ROLL_PTR(回滚指针针)
|
张三 | 28 | null | 1 | null |
(3)我们就有了一个基于链表记录的历史版本链。
(4)一些思考
⑥ 所有事物删改查的时候都叫当前读,因为访问的是最新的数据,所以一定是要加锁的 ; 如果要进行select也要读取最新版本一定是需要加锁的。如果是快照读就不受加锁的限制,因为是历史数据,历史版本不会被修改,被修改的永远是最新版本,只要读取历史版本就不需要加锁!
⑧那为什么要有隔离级别呢?
(1)基本概念
(2)Read View类简化
- class ReadView {
- // 省略...
-
- private:
-
- /** 高水位,大于等于这个ID的事务均不可见*/
- trx_id_t m_low_limit_id
-
- /** 低水位:小于这个ID的事务均可见 */
- trx_id_t m_up_limit_id;
-
- /** 创建该 Read View 的事务ID*/
- trx_id_t m_creator_trx_id;
-
- /** 创建视图时的活跃事务id列表*/
- ids_t m_ids;
-
- /** 配合purge,标识该视图不需要小于m_low_limit_no的UNDO LOG,
- * 如果其他视图也不需要,则可以删除小于m_low_limit_no的UNDO LOG*/
- trx_id_t m_low_limit_no;
-
- /** 标记视图是否被关闭*/
- bool m_closed;
-
- // 省略...
- };

(3)一张图加深理解
(4)源码对应策略
(5)整体流程
- //事务2的 Read View
-
- m_ids; // 1,3
- up_limit_id; // 1
- low_limit_id; // 4 + 1 = 5,原因:ReadView生成时刻,系统尚未分配的下一个事务ID
- creator_trx_id // 2
- //事务2的 Read View
-
- m_ids; // 1,3
- up_limit_id; // 1
- low_limit_id; // 4 + 1 = 5,原因:ReadView生成时刻,系统尚未分配的下一个事务ID
- creator_trx_id // 2
-
- //事务4提交的记录对应的事务ID DB_TRX_ID=4
-
- //比较步骤
- DB_TRX_ID(4)< up_limit_id(1) ? 不小于,下一步
- DB_TRX_ID(4)>= low_limit_id(5) ? 不大于,下一步
- m_ids.contains(DB_TRX_ID) ? 不包含,说明,事务4不在当前的活跃事务中。
-
- //结论 故,事务4的更改,应该看到,因为已经提交了。
- 所以事务2能读到的最新数据记录是事务4所提交的版本,
- 而事务4提交的版本也是全局角度上最新的版本

(1)当前读和快照读在RR级别下的区别
(2)结论
(3)本质区别
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。