CLI の手引きおよび解説書

SQLTransact - トランザクション管理

DB2 CLI バージョン 5 以降におけるこの関数の状況
注:

ODBC バージョン 3 では、SQLTransact() は使用すべきでない関数で、代わりに SQLEndTran() を使用します。詳しくは SQLEndTran - 接続のトランザクションの終了を参照してください。

DB2 CLI のこのバージョンでは、引き続き SQLTransact() がサポートされていますが、最新の標準に合わせて、SQLEndTran() を DB2 CLI プログラムでご使用になることをお勧めします。

上記の関数と、その他の使用すべきでない関数の詳細については、 バージョン 5 で使用すべきでない DB2 CLI 関数を参照してください。

新しい関数への移行

たとえば、次の旧ステートメント

   SQLTransact(henv, hdbc, SQL_COMMIT);

は、新しい関数を使用して、以下のように書き換えます。

   SQLEndTran(SQL_HANDLE_ENV, henv, SQL_COMMIT);

目的
仕様: DB2 CLI 1.1 ODBC 1.0 ISO CLI

SQLTransact() は、指定の接続にある現在のトランザクションをコミットまたはロールバックします。 SQLTransact() は、環境に関連付けられている各接続に対して出されるコミットまたはロールバックを要求する際に使用することができます。

接続時刻または直前の SQLTransact() 呼び出し (どちらか現在に近い方) より後に、接続でデータベースに加えられた変更は、すべてコミットまたはロールバックされます。

接続でトランザクションが活動状態の場合、アプリケーションはデータベースから切断する前に SQLTransact() を呼び出しておく必要があります。

構文

SQLRETURN   SQLTransact      (SQLHENV           EnvironmentHandle, /* henv */
                              SQLHDBC           ConnectionHandle,  /* hdbc */
                              SQLUSMALLINT      Type);             /* fType */

関数引き数

表 181. SQLTransact 引き数
データ・タイプ 引き数 使用法 説明
SQLHENV EnvironmentHandle 入力 環境ハンドル

ConnectionHandle が有効な接続ハンドルである場合、 EnvironmentHandle は無視されます。

SQLHDBC ConnectionHandle 入力 データベース接続ハンドル。

ConnectionHandle を SQL_NULL_HDBC に設定しない場合、 EnvironmentHandle には接続を関連付ける環境ハンドルを入れる必要があります。

SQLUSMALLINT Type 入力 ご希望のトランザクション用のアクション。この引き数の値は、次のうちの 1 つでなければなりません。
  • SQL_COMMIT
  • SQL_ROLLBACK

使用法

DB2 CLI では、活動トランザクションがまだないアプリケーションが SQLPrepare()SQLExecDirect()SQLExecDirect()SQLGetTypeInfo()、またはカタログ関数のどれかを出すと、トランザクションが暗黙に開始されます。アプリケーションが SQLTransact() を呼び出すと、トランザクションが終了します。

入力接続ハンドルが SQL_NULL_HDBC であり、かつ環境ハンドルが有効である場合、コミットやロールバックは環境内の各オープン接続で出されます。 SQL_SUCCESS が戻されるのは、すべての接続でコミットやロールバックの成功が報告されたときだけです。 1 つまたは複数の接続でコミットやロールバックが失敗すると、 SQLTransact() が SQL_ERROR を戻します。どの接続でコミットやロールバック操作が失敗したかを判別するには、環境内の接続ハンドルでアプリケーションが SQLError() を呼び出すことが必要です。

重要な点として、接続オプション SQL_ATTR_CONNECTTYPE が SQL_COORDINATED_TRANS (整合分散トランザクションを示す) に指定されていないかぎり、整合グローバル・トランザクションに 1 フェーズまたは 2 フェーズのコミット・プロトコルが提供されることはありません。

トランザクションが終了すると、次のような結果になります。

接続上で現在活動状態になっているトランザクションがない場合は、 SQLTransact() を呼び出してもデータベース・サーバーには影響はなく、 SQL_SUCCESS が戻されます。

接続が失われたために、 COMMIT または ROLLBACK の実行中に SQLTransact() が失敗するおそれがあります。この場合、アプリケーションは COMMIT または ROLLBACK を処理したかどうかを判別することができない場合があり、またデータベース管理者の援助が必要となる場合があります。トランザクション・ログやその他のトランザクション管理タスクの詳細については、 DBMS 製品情報を参照してください。

戻りコード

診断

表 182. SQLTransact SQLSTATE
SQLSTATE 説明 解説
08003 接続がクローズされています。 ConnectionHandle は、接続状態にありませんでした。
08007 トランザクション中に、接続に障害が起きました。 ConnectionHandle に関連した接続は関数の実行時に失敗し、要求された COMMIT または ROLLBACK が失敗する前に行われたかどうかを判別できません。
58004 予期しないシステム障害です。 回復不能システム・エラー。
HY001 メモリーの割り振り失敗です。 DB2 CLI は、関数の実行または完了をサポートするのに必要なメモリーを割り振ることができません。
HY012 トランザクション・コードが無効です。 引き数 Type に指定された値は、 SQL_COMMIT でも SQL_ROLLBACK でもありませんでした。
HY013 予期しないメモリーのハンドル・エラーが起きました。 DB2 CLI は、関数の実行または完了をサポートするのに必要なメモリーを使用することができませんでした。

制約

なし。

SQLEndTran - 接続のトランザクションの終了を参照してください。

参照


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]