本記事では、さまざまなトランザクションログタイプの詳細な構造と説明について紹介します。
トランザクションの種類
トランザクションの操作タイプとデータアクセスの分布に基づいて、トランザクションを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ログで、トランザクションの変更内容が含まれます(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_ |
上記3つのフィールドから計算されるハッシュ値。 |
説明
OceanBaseデータベースでは64ビットのハッシュ値を採用しているため、2つの異なるトランザクション識別子のハッシュ値が衝突する確率は非常に低いです。そのため、ほとんどの場合、ハッシュ値を使用して異なるトランザクションを区別できます。