首批通过分布式安全可靠测评,为关键业务系统打造
事务日志说明
更新时间:2026-06-03 08:41:19
本文介绍了不同事务日志类型的详细结构及说明。
事务类型
根据事务的操作类型以及访问数据的分布,可以将事务分为两种类型:
- 本地单分区事务:事务信息的维护与该事务的访问数据在同一个节点上(同一个 OBServer 节点),且该事务仅访问同一个数据分区内的数据。
- 分布式事务:事务信息的维护与该事务的访问数据在不同节点上,或者事务访问多个数据分区。
事务日志记录类型
根据事务日志记录产生的阶段,可以将事务日志记录分为两类:
- 事务执行时日志记录
- 事务提交时日志记录
事务执行时日志记录
在事务执行过程中,如果需要对事务的修改进行持久化,则相应事务将产生日志记录并对其进行持久化,这类日志记录称之为事务执行时日志记录。 事务执行时日志记录的类型如下所示:
| 日志类型 | 内部类型值 | 说明 |
|---|---|---|
OB_LOG_MUTATOR |
0x200 | 事务的 mutator 日志,包含事务的修改内容。 |
OB_LOG_TRANS_STATE |
0x400 | 事务的状态日志。 |
OB_LOG_MUTATOR_WITH_STAT |
0x600 | 事务的状态日志,携带 mutator 日志。 |
OB_LOG_MUTATOR_ABORT |
0x800 | 事务的 abort 日志,用于标记该事务已回滚。 |
事务提交时日志记录
事务进入到提交阶段后,需要对事务的修改进行持久化。在该阶段,根据事务的不同类型,将产生不同类型的事务日志记录。
分布式事务的提交时日志记录的类型如下所示:
日志类型 内部类型值 说明 OB_LOG_TRANS_REDO0x1 分布式事务的 redo 日志,包含事务的修改内容(redo日志)。 OB_LOG_TRANS_PREPARE0x2 分布式事务的 prepare 日志。 OB_LOG_TRANS_REDO_WITH_PREPARE0x3 分布式事务的prepare日志,包含事务的修改内容(redo日志)。 OB_LOG_TRANS_COMMIT0x4 分布式事务的 commit 日志,标记该事务已提交。 OB_LOG_TRANS_ABORT0x8 分布式事务的 abort 日志,标记该事务已回滚。 OB_LOG_TRANS_CLEAR0x10 分布式事务的 clear 日志,用于释放事务上下文信息。 本地单分区事务的提交时日志记录的类型如下所示:
日志类型 内部类型值 说明 OB_LOG_SP_TRANS_REDO0x20 单分区事务的 redo 日志,包含事务的修改内容(redo日志)。 OB_LOG_SP_TRANS_COMMIT0x40 单分区事务的 commit 日志,标记该事务已提交,包含事务的修改内容(redo日志)。 OB_LOG_SP_TRANS_ABORT0x80 单分区事务的 abort 日志,标记该事务已回滚。
事务标识符 (Transaction ID)
事务标识符主要用于区分 OBServer 节点内部的不同事务。因此,事务标识符需要具有唯一性,不同事务具有不同的事务标识符。 为了实现事务标识符的唯一性,事务标识符的结构如下所示:
class ObTransID
{
uint64_t hv_;
common::ObAddr server_;
int64_t inc_;
int64_t timestamp_;
}
下表列出了字段名的详细信息。
| 字段名 | 说明 |
|---|---|
server_ |
维护该事务标识符的 OBServer 节点的 IP 地址。 |
inc_ |
OBServer 节点维护的单调递增值,OBServer 节点重启后重新计数。 |
timestamp_ |
创建该事务标志符时的本地物理时钟值(Unix时间戳)。 |
hv_ |
根据以上三个字段计算得到的 hash 值。 |
说明
由于 OceanBase 数据库采用了 64 位 hash 值,两个不同事务标识符的 hash 值产生冲突的概率极低。因此,在大多数情况下,可以使用 hash 值来区分不同事务。