InnoDB 事务可见性

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 ;如果不属于即可以被看到,如果属于即不可以被看到

---------------------这样正好解决了第一种说法的问题

 

上一篇:波场TRX在.Net Core C#中实现助记词和HDWallet


下一篇:mysql锁表处理方法