InnoDB在每行记录的后面会隐性的增加两列:创建版本号和删除版本号
数据库每开启一个事务,就会生成一个系统版本号 用来和数据库行记录的版本号进行对比
insert 在行记录创建版本号标识上创建时候的系统版本
delete 在行记录删除版本号标识上当前系统版本
update delete和insert的合集
以上貌似是错误的;如果事务A申请版本号是30, 事务B申请版本号是31 因为有可能后申请事务B先提交了,但是还是不能被事务A所看到;
实际上行记录后面增加了三个隐藏字段:
DB_ROW_ID:行ID,有主键的时候,则无此字段(此字段是单调递增的)
DB_TRX_ID:记录新增或者更新的事务ID
DB_ROLL_PTR:回滚指针,指向undo log记录。如果有多条,则是通过此字段链接形成一个类似版本链的概念
如果设置数据库的隔离级别为 RR;每开启一个事务,系统分配一个事务ID;在执行第一个select语句的时候,会生成一个当前时间点的事务快照ReadView:
- trx_ids : 当前系统活跃的事务Id列表,就是还没有执行提交的事务集合
- up_limit_id:低水位,取trx_ids中最小的那个,trx_ids中最小的那个
- low_limit_id:高水位,取生成ReadView的时候,系统即将分配的下一个事务Id
- creator_trx_id:当前事务id
低于 up_limit_id 则被看到;高于等于low_limit_id不能被看到;up_limit_id < 版本号 < low_limit_id 如果在此区间看是否属于集合trx_ids ;如果不属于即可以被看到,如果属于即不可以被看到
---------------------这样正好解决了第一种说法的问题