永続性の設定

トランザクションの永続性を制御するには、Durability属性を使用します。この属性は、トランザクションが永続コミットの準備ログ・レコードを作成するかどうかを定義します。この属性の設定にかかわらず、DDL文を含むトランザクションは永続コミットの準備ログ・レコードをコミットします。Durability属性では、次の2つの値がサポートされます。

Durabilityを1に設定した場合

Durability属性を1に設定すると、参加者が分散トランザクションの永続コミットの準備ログ・レコードおよび非永続コミット・ログ・レコードを書き込みます。Durability属性を1に設定すると、コミットされたトランザクションが失敗した場合にリカバリ可能になります。これは、K-safetyが1に設定されている場合のDurability属性のデフォルト設定です。

Durability属性の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』Durabilityを参照してください。

Durabilityを0に設定した場合

Durability属性を0に設定すると、参加者が分散トランザクションの非永続コミットの準備ログ・レコードおよびコミット・ログ・レコードを書き込みます。永続性を確保するために、TimesTen Scaleoutには、通常、Durability属性が0に設定されているデータベース専用の次の新機能が用意されています。

エポック・トランザクション

エポック・トランザクションは、データベースのすべての要素間でグローバルに一貫性のあるポイントをマークする永続コミット・ログ・レコードを作成する分散トランザクションです。エポック・トランザクションは、データベースのすべての要素に永続的にコミットされます。エポック・トランザクションにより、エポック・トランザクションのタイムスタンプまでデータベースに一貫性があることが確認されます。つまり、エポック・トランザクションによって、すでにコミット・フェーズにあるトランザクションがリカバリ可能となります。

ノート:

TimesTen Scaleoutでは、Lamportタイムスタンプを使用して、データベースの別の要素でコミットするトランザクションの部分的な順序付けを提供します。各要素には、特に、準備とコミットの操作によって更新されるLamportタイムスタンプが含まれています。トランザクション・マネージャは、コミットされたすべてのトランザクションのLamportタイムスタンプをログに記録します。

TimesTen Scaleoutは、障害が発生した要素を含むレプリカ・セットが関与するトランザクションの、永続コミットの準備ログ・レコードを、障害が発生した要素がリカバリされるまで書き込むため、K-safetyが2(以上)に設定されているグリッドと、Durability属性が0に設定されているデータベースでのトランザクションは、通常の条件下では永続的です。レプリカ・セットの両方の要素で同時に障害が発生した場合にのみ、トランザクションが非永続になります。ただし、TimesTen Scaleoutでは、トランザクションをエポック・トランザクションに昇格できます。エポック・トランザクションのエポック・コミット・ログ・レコードでマークされた一貫性のある時点にデータベースをリカバリできるため、エポック・トランザクションとその前にコミットされたすべてのトランザクションには、重大な障害に対するより高いリジリエンスがあります。

ノート:

トランザクションを昇格する前に、エポック・トランザクションは、コミットの準備およびコミット・フェーズの永続ログ・レコードを作成し、トランザクションのエポック・トランザクションへの昇格の前には参加者ではなかったものを含むデータベースのすべての要素が関連するため、エポック・トランザクションのコミットは通常のトランザクションのコミットよりも負荷が高いことを考慮してください。

次の組込みプロシージャおよびシステム・ビューを使用して、エポック・トランザクションを昇格および管理します。

  • ttEpochCreate組込みプロシージャは、読取り専用トランザクションを含むトランザクションをエポック・トランザクションに昇格します。

  • ttDurableCommit組込みプロシージャは、書込みトランザクションをエポック・トランザクションに昇格します。

  • SYS.V$EPOCH_SESSIONシステム・ビューには、接続が最後から2番目のチェックポイント処理以降に作成された最新のエポック・トランザクションのLamportタイムスタンプが格納されます。

次の例では、エポック・トランザクションへの書込みトランザクションの昇格を示し、検証します。

Command> autocommit OFF;
Command> INSERT INTO transactions VALUES (txn_seq.NEXTVAL, 189, SYSDATE, NULL, 'A', 5.49);
Command> SELECT epoch FROM sys.v$epoch_session;
< 1023.1 >
1 row found.
Command> CALL ttEpochCreate();
Command> COMMIT;
Command> SELECT epoch FROM sys.v$epoch_session;
< 1024.1 >
1 row found.

ttEpochCreateまたはttDurableCommit組込みプロシージャの詳細は、それぞれ『Oracle TimesTen In-Memory Databaseリファレンス』ttEpochCreateまたはttDurableCommitを参照してください。

SYS.V$EPOCH_SESSIONシステム・ビューの詳細は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』SYS.V$EPOCH_SESSIONを参照してください。

EpochInterval属性

各エポック・コミット・ログ・レコードは、各要素の特定のチェックポイント・ファイルに関連付けられます。要素に予期しない障害が発生した場合、リカバリ・プロセスでは、最新のエポック・コミット・ログ・レコードに関連付けられている各要素のチェックポイント・ファイルを使用する必要があります。このチェックポイントは、必ずしもその要素の最新のチェックポイントではありません。

最初の接続属性EpochIntervalを使用して、指定された間隔で定期エポック・トランザクションを生成するようにデータベースを構成できます。すべてのチェックポイント処理を実行するエポック・トランザクションが少なくとも1つはあるように、EpochInterval属性に設定された値は、最初の接続属性CkptFrequencyに設定されている値の半分未満である必要があります。CkptFrequency属性を0より大きい値に設定し、EpochInterval属性をCkptFrequency属性に設定された値の半分よりも大きい値に設定すると、TimesTen Scaleoutは、EpochInterval属性をCkptFrequency属性に設定された値の半分に再調整します。

EpochIntervalまたはCkptFrequency属性の詳細は、それぞれ『Oracle TimesTen In-Memory Databaseリファレンス』EpochIntervalまたはCkptFrequencyを参照してください。

CreateEpochAtCommit属性

CreateEpochAtCommit一般接続属性を使用して、エポック・トランザクションへの接続によってコミットされたすべての書込みトランザクションを昇格するように接続を構成できます。CreateEpochAtCommit属性を1に設定すると、接続時にコミットするすべてのトランザクションが、障害が発生した場合にリカバリ可能になります。ただし、エポック・トランザクションと同様に、コミット操作は、通常のトランザクションよりも負荷が高いため、重要な操作のみにCreateEpochAtCommit=1を限定することをお薦めします。

ノート:

DurableCommits属性はTimesTen Classicのデータベースを対象としていますが、この属性は、TimesTen Scaleoutのデータベースで1に設定されている場合、CreateEpochAtCommit属性の動作をエミュレートします。『Oracle TimesTen In-Memory Databaseリファレンス』DurableCommitsを参照してください。

表6-1に示すように、Durability属性が0に設定されている場合、トランザクション・マネージャと参加者は、CreateEpochAtCommit属性の設定によって動作が異なります。

表6-1 CreateEpochAtCommitの設定に基づくコミットでの参加者の動作

CreateEpochAtCommit コミット動作

0

参加者は、分散トランザクションの非永続コミットの準備およびコミット・ログ・レコードを書き込みます。

1

すべてのトランザクションがエポック・トランザクションに昇格します。

DurabilityおよびCreateEpochAtCommit属性の両方を0に設定すると、最高のパフォーマンスが得られます。この場合は、ttEpochCreateまたはttDurableCommit組込みプロシージャを呼び出して、重要なトランザクションの永続レコードがあることを確認します。

DurabilityまたはCreateEpochAtCommit属性の詳細は、それぞれ『Oracle TimesTen In-Memory Databaseリファレンス』DurabilityまたはCreateEpochAtCommitを参照してください。ttEpochCreateまたはttDurableCommit組込みプロシージャの詳細は、それぞれ『Oracle TimesTen In-Memory Databaseリファレンス』ttEpochCreateまたはttDurableCommitを参照してください。