http://dev.mysql.com/doc/refman/5.1/en/innodb-multi-versioning.html
InnoDB的row存储了DB_TRX_ID(6-byte), a special bit set to mark as deleted, DB_ROLL_PTR(7-byte)指向数据文件(innodb datafile)中的undo log, DB_ROW_ID(6-byte).
DB_ROLL_PTR也就是《HIGHPerformanceMySQL》第二版中115页Figure3-7中的RP。
DB_ROLL_PTR指向的undo log有两个作用(undo log由两个部分组成:insert undo log和update undo log),一是回滚当前事务(由insert undo log实现,所以它在事务commit以后就丢弃了,insert undo log中的insert不是指针对insert的,指所有dml操作,undo log也不是一直记录所有的动作的回滚动作,在这里只存储到事务递交,数据库的定点还原是由查看bin log等正常顺序日志人工回滚实现的),二是保证各进程的数据的一致性(由update undo log实现,它的存在时间是直到没有其他事务对当前行就行操作,形成一个队列,否则后面的先递交前面的undo log也不能还原了,update undo log也是有序的,有的话不丢弃,要为那些事务做一个snapshot,没有以后丢弃)。
所以一定要注意rollback segment不能太大,也许会有很多update undo log的pointer记录。
还有在执行SQL语句的删除时,数据不是马上删除的,要等到update undo log也清除相应记录以后,只是一般延迟很短感觉不出来。
还可以通过设置innodb_max_purge_lag来防止一些极端特殊的场景出现。
标签: DB_TRX_ID, InnoDB, insert undo log, MVCC, pointer, update undo log