本記事では、異なるトランザクションログタイプの詳細な構造と説明について紹介します。
トランザクションタイプ
トランザクションの操作タイプとデータアクセスの分布に基づき、トランザクションは以下の2種類に分類できます:
- ローカル単一パーティショントランザクション:トランザクション情報のメンテナンスとそのトランザクションがアクセスするデータが同一ノード(同一OBServerノード)上にあり、かつそのトランザクションがアクセスするデータが同一データパーティション内のみである場合。
- 分散トランザクション:トランザクション情報のメンテナンスとそのトランザクションがアクセスするデータが異なるノード上にある場合、またはトランザクションが複数のデータパーティションにアクセスする場合。
トランザクションタイプの詳細については、ローカルトランザクションおよび分散トランザクションを参照してください。
トランザクションログ記録タイプ
トランザクションログ記録が生成される段階に基づき、トランザクションログ記録は以下の2種類に分類できます:
- トランザクション実行時のログ記録
- トランザクションコミット時のログ記録
トランザクション実行時のログ記録
トランザクションの実行中に、トランザクションの変更を永続化する必要がある場合、該当するトランザクションはログ記録を生成し、それを永続化します。この種のログ記録をトランザクション実行時のログ記録と呼びます。 トランザクション実行時のログ記録のタイプは以下のとおりです:
ログタイプ |
内部タイプ値 |
説明 |
|---|---|---|
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ログで、トランザクションの変更内容を含みます。 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ログ。トランザクションの変更内容を含みます。 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_ |
上記3つのフィールドに基づいて計算されるハッシュ値。 |
説明
OceanBaseデータベースでは64ビットのハッシュ値を採用しているため、異なる2つのトランザクション識別子のハッシュ値が衝突する確率は極めて低いです。そのため、ほとんどの場合、ハッシュ値を用いて異なるトランザクションを区別できます。