网站电脑版和手机版区别,义乌手工活外发加工网160网,jsp网站开发实训,潍坊网站定制模板建站表的隐藏字段
表的列包含用户自定义的列和由系统自动创建的隐藏字段。我们介绍3个隐藏字段#xff0c;不理解也没有关系#xff0c;理解后面的undo log就懂了#xff1a;
DB_TRX_ID #xff1a;6 byte#xff0c;最近修改( 修改/插入 )事务ID#xff0c;记录创建这条记…表的隐藏字段
表的列包含用户自定义的列和由系统自动创建的隐藏字段。我们介绍3个隐藏字段不理解也没有关系理解后面的undo log就懂了
DB_TRX_ID 6 byte最近修改( 修改/插入 )事务ID记录创建这条记录/最后一次修改该记录的事务ID DB_ROLL_PTR : 7 byte回滚指针指向这条记录的上一个版本简单理解成指向历史版本就行这些数据一般在 undo log 中 DB_ROW_ID : 6 byte隐含的自增ID隐藏主键如果数据表没有主键 InnoDB 会自动以DB_ROW_ID 产生一个聚簇索引
undo log
undo log是一个缓冲区用来存放记录修改的历史记录。
以下面这个表为例讲解 当我们插入一条记录后这个表中的内容实际上是这样的
idnameDB_TRX_IDDB_ROLL_PTR...1Tom创建当前记录的事务id假设为1null
如果我们在一个事务中修改这个记录它的过程是这样的 先将当前记录做备份放到undo log中。同时将修改后的记录的DB_ROLL_PTR设置为上一个记录的地址。就这样将记录的每个版本都用回滚指针连起来形成一个版本控制链。当我们想要回滚到某个版本时就可以直接找到。这一个个版本我们称之为快照。 另外不需要考虑undo log满的情况。在一个事务commit之后修改记录的所有版本都会释放。 ReadView
undo log看起来和隔离性没什么关系其实不然。隔离性是由undo log和readview配合实现的
先介绍连个两个概念
当前读读取最新的记录就是当前读。增删改都叫做当前读。
快照读读取记录的历史版本(一般而言)就叫做快照读。 Readview是一个类可以记录数据库当前活跃事务的id以及事务id的分配情况相当于当前数据库的一个快照。我们简单了解几个类成员
m_ids; //一张列表用来记录Read View生成时系统正进行的事务的IDup_limit_id; //记录m_ids列表中事务ID最小的ID小于这个值的事务id就说明这个事务已经commit了。low_limit_id; //ReadView生成时刻系统尚未分配的下一个事务ID也就是目前已出现过的事务ID的最大值1。大于这个id值的事务就是在Read View生成后新开始的事务。creator_trx_id //创建该ReadView的事务ID
隔离性的实现
ReadView会在事务进行快照读的时候创建此时事务会被分成三类 对于read uncommitted这三类事务的记录快照对于当前进行的事务来讲全部可见。
对于read committed和repeatable read在第一个区间的事务id的记录快照可见在第二个区间内但是不在m_ids中的事务的记录快照也可见但是在m_ids中的事务的记录快照不可见在第三个区间的事务的记录快照不可见。
那么RC和RR的区别在哪
对于RC当前事务每次进行快照读的时候都会创建ReadView。因此当并行事务commit后再进行快照读这条记录就会变得可见。
对于RR只在事务第一次进行快照读时创建ReadView后续不会再创建。因此不管并行的事务是否commit都无法看到修改后的记录。