トランザクションの暗黙的なコミット動作
アプリケーションでDML文またはDDL文について暗黙的コミット動作が有効になるようにするか明示的コミット動作が必要になるようにするかを構成できます。
トランザクションの自動コミット動作
自動コミットでは、DML文またはDDL文の後に暗黙的なコミットを発行するかどうかを構成します。
一部のデータベースAPI (ODBCやJDBCなど)では自動コミットがサポートされており、これらのAPIを使用する場合はデフォルトで有効になっています。その他のAPI (OCIなど)では、自動コミット機能は提供されません。
自動コミットが有効になっている場合、次の動作が実行されます
-
暗黙的なコミットは、文が正常に実行された直後に発行されます。
-
暗黙的なロールバックは、主キー違反など、文が失敗した直後に発行されます。
-
文によって結果セットが生成された場合、その結果セットおよびトランザクション内で開いている他の結果セットを明示的に閉じるまで、自動コミットは発行されません。結果セットが開いているときに処理された文は、すべての結果セットが閉じられるまでコミットされません。
結果セットのすべての行をフェッチしても、結果セットは自動的に閉じません。結果セットの処理後、コミット読取り分離レベルを使用している場合は結果セットを明示的に閉じる必要があり、シリアライズ可能分離レベルを使用している場合はトランザクションを明示的にコミットまたはロールバックする必要があります。
ノート:
永続コミットおよび自動コミットが有効でも、障害が発生した場合または結果セットを閉じる前にアプリケーションが終了した場合は、作業内容が失われることがあります。
-
自動コミットが有効になっている場合に、ODBCまたはJDBCのバッチ処理を使用して、1回のコールで複数行に対して
INSERT
、UPDATE
またはDELETE
を実行すると、コミットはバッチ処理全体が終了してから実行されます。バッチ処理中にエラーが発生した場合は、正常に変更された行がこのトランザクション内でコミットされます。特定の行の問題が原因でエラーが発生した場合は、エラーが発生した行の前の行で、正しく変更された行のみがこのトランザクション内でコミットされます。ODBCSQLParamOptions
関数のpirow
パラメータには、バッチで問題が発生した行の番号が含まれます。
各文の後にコミットを暗黙的に行うと、パフォーマンス・コストが高くなり、煩わしくなる可能性があります。TimesTenでは、すべてのコミットを意図的に行うようにするため、自動コミットを無効にすることをお薦めします。自動コミットを無効にすると、すべての文の後に暗黙的なコミットを実行することはないため、トランザクションの境界を制御したり、1つのトランザクションで複数の文を実行したり、パフォーマンスを向上することができます。
自動コミットを無効にすると、次のいずれかの処理を実行した後に、コミットまたはロールバックでトランザクションを明示的に完了する必要があります。
-
トランザクションで実行することになっていた作業をすべて完了した後。
-
トランザクション一貫性(ブロッキング)チェックポイント・リクエストを発行した後。
-
問合せオプティマイザが使用する列統計および表統計を更新した後。
-
ttLockWait
などのプロシージャで指定した新しい設定を有効にするために、結果セットを生成しないTimesTen組込みプロシージャをコールした後。
自動コミット設定を変更する前に、データベース接続を確立する必要があります。自動コミットを無効にするには、次のいずれかの処理をします。
-
ODBCベースのアプリケーションでは、
SQL_AUTOCOMMIT_OFF
を使用してSQLSetConnectOption
関数を実行します。 -
JDBCアプリケーションでは、
C
onnection.setAutoCommit
(false)
メソッドを使用します。 -
ttIsql
の実行中に、autocommit 0
コマンドを発行します。
TimesTenのDDLコミット動作
TimesTenデータベースでは、DDL文の前後に暗黙的なCOMMIT
が発行されます。各DDL文の処理後に永続コミットが実行されます。この動作は、Oracle Databaseと同じです。
DDL文には次のものがあります。
-
表、ビュー、ユーザー、プロシージャ、索引などのデータベース・オブジェクトに対する
CREATE
、ALTER
およびDROP
文。 -
TRUNCATE
-
GRANT
およびREVOKE
次の点に注意してください。
-
DDLによる変更をロールバックできません。
-
グローバル一時表が
ON COMMIT PRESERVE ROWS
句を使用して作成された場合を除いて、DDL文によってグローバル一時表からレコードが削除されます。 -
作成した表は
CREATE TABLE
. . .AS SELECT
文を使用した場合、すぐに表示されます。 -
TRUNCATE
文が自動的にコミットされます。ただし、親表および子表は別のトランザクションで切り捨てる必要があり、その際には、子表が先に取り捨てられます。子表が空でなければ、親表は切り捨てられません。