本記事では、さまざまなトランザクションログタイプの詳細な構造と説明について紹介します。
トランザクションの種類
トランザクションの操作タイプとデータアクセスの分散状況に基づき、トランザクションは以下の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ログ。トランザクションがコミットされたことを示し、トランザクションの変更内容を含みます。 OB_LOG_SP_TRANS_ABORT0x80 シングルパーティショントランザクションのabortログ。トランザクションがロールバックされたことを示します。
トランザクションID (Transaction ID)
トランザクションIDは、OBServerノード内の異なるトランザクションを区別するために主に使用されます。そのため、トランザクションIDは一意である必要があり、異なるトランザクションはそれぞれ異なるトランザクションIDを持ちます。 トランザクションIDの一意性を実現するため、トランザクションIDの構造は以下のとおりです:
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つのトランザクションIDのハッシュ値が衝突する確率は極めて低いです。そのため、ほとんどの場合、このハッシュ値を用いて異なるトランザクションを区別できます。