SequoiaDB 巨杉数据库中的事务日志记录了事务对数据库的所有更改,是备份和恢复的重要组件,也在事务操作中被用于回滚数据。因此事务日志中通常包含 REDO 和 UNDO 两部分,其中 REDO 部分用于数据恢复和复制组节点间数据进行增量同步,UNDO 部分用于事务回滚操作恢复数据到事务操作前的状态。
如执行更新操作的事务日志中,将分别记录新值(New)和旧值(Orig):
Version: 0x00000001(1) LSN : 0x0000000058b90740(236) PreLSN : 0x0000000058b906d0(156) Length : 228 Type : UPDATE(2) FullName : sample.employee Orig id : { "_id": { "$oid": "5c88afe31a3f5822754040d0" } } Orig : { "$set" : { "balance" : 10000 } } New id : { "_id": { "$oid": "5c88afe31a3f5822754040d0" } } New : { "$set" : { "balance" : 8000 } } TransID : 0x00040069d6d96e TransPreLSN : 0x0000000058b906d0
如果事务日志的记录中有事务 ID(TransID) 表示该日志记录是某个事务的事务日志,同一个事务的事务日志有相同的事务 ID。可以通过 TransPreLSN 查找同一个事务的前一条事务日志。
事务日志中事务开启日志和事务的第一个操作合并,事务日志的事务 ID(IDAttr)带有 Start 标签的事务日志为事务的开启日志,即事务的第一个操作。
Version: 0x00000001(1) LSN : 0x00000000000000ec(236) PreLSN : 0x000000000000009c(156) Length : 228 ... TransID : 0x00040069d6d96e IDAttr :Start
事务的预提交日志表示事务将进入 WAIT-COMMIT 状态:
Version: 0x00000001(1) LSN : 0x0000000058b90740(1488521024) PreLSN : 0x0000000058b906d0(1488520912) Length : 100 Type : COMMIT(12) FirstLSN : 0x0000000058b90670 Attr : 1(Pre-Commit) NodeNum : 1 Nodes : [ (1001,1003) ] TransID : 0x000400727828cc IDAttr : TransPreLSN : 0x0000000058b906d0
其中,事务日志中 Nodes 将标明参与事务的数据节点,用于二阶段协议出错时节点间进行协商。
Note:
SequoiaDB 分布式事务的二阶段提交协议可参考二阶段提交。
事务的提交日志表示事务已经提交:
Version: 0x00000001(1) LSN : 0x0000000058b907a4(1488521124) PreLSN : 0x0000000058b90740(1488521024) Length : 80 Type : COMMIT(12) FirstLSN : 0x0000000058b90670 Attr : 2(Commit) TransID : 0x000400727828cc IDAttr : TransPreLSN : 0x0000000058b90740
事务回滚日志与事务之前的操作日志一一对应,事务 ID(IDAttr)带有 Rollback 标签:
Version: 0x00000001(1) LSN : 0x0000000058b90740(236) PreLSN : 0x0000000058b906d0(156) Length : 228 Type : UPDATE(2) FullName :sample.employee Orig id : { "_id": { "$oid": "5c88afe31a3f5822754040d0" } } Orig : { "$set" : { "balance" : 8000 } } New id : { "_id": { "$oid": "5c88afe31a3f5822754040d0" } } New : { "$set" : { "balance" : 10000 } } TransID : 0x00040069d6d96e IDAttr : Rollback TransPreLSN : 0x0000000058b906d0