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 */
関数引き数
データ・タイプ | 引き数 | 使用法 | 説明 |
---|---|---|---|
SQLHENV | EnvironmentHandle | 入力 | 環境ハンドル
ConnectionHandle が有効な接続ハンドルである場合、 EnvironmentHandle は無視されます。 |
SQLHDBC | ConnectionHandle | 入力 | データベース接続ハンドル。
ConnectionHandle を SQL_NULL_HDBC に設定しない場合、 EnvironmentHandle には接続を関連付ける環境ハンドルを入れる必要があります。 |
SQLUSMALLINT | Type | 入力 | ご希望のトランザクション用のアクション。この引き数の値は、次のうちの 1 つでなければなりません。
|
使用法
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 フェーズのコミット・プロトコルが提供されることはありません。
トランザクションが終了すると、次のような結果になります。
上記の状況のいずれかの理由で、カーソル位置が維持されない場合、カーソルはクローズされ、保留されているすべての結果が破棄されます。
カーソル位置がコミット後に維持される場合、残りの結果セットの処理が続行される前に、アプリケーションは取り出しを発行してカーソルを (次の行に) 位置指定し直すことが必要です。
コミット後にカーソル位置が維持されているかどうかを判別するには、 SQL_CURSOR_COMMIT_BEHAVIOR 情報タイプを指定して SQLGetInfo() を呼び出してください。
接続上で現在活動状態になっているトランザクションがない場合は、 SQLTransact() を呼び出してもデータベース・サーバーには影響はなく、 SQL_SUCCESS が戻されます。
接続が失われたために、 COMMIT または ROLLBACK の実行中に SQLTransact() が失敗するおそれがあります。この場合、アプリケーションは COMMIT または ROLLBACK を処理したかどうかを判別することができない場合があり、またデータベース管理者の援助が必要となる場合があります。トランザクション・ログやその他のトランザクション管理タスクの詳細については、 DBMS 製品情報を参照してください。
戻りコード
診断
SQLSTATE | 説明 | 解説 |
---|---|---|
08003 | 接続がクローズされています。 | ConnectionHandle は、接続状態にありませんでした。 |
08007 | トランザクション中に、接続に障害が起きました。 | ConnectionHandle に関連した接続は関数の実行時に失敗し、要求された COMMIT または ROLLBACK が失敗する前に行われたかどうかを判別できません。 |
58004 | 予期しないシステム障害です。 | 回復不能システム・エラー。 |
HY001 | メモリーの割り振り失敗です。 | DB2 CLI は、関数の実行または完了をサポートするのに必要なメモリーを割り振ることができません。 |
HY012 | トランザクション・コードが無効です。 | 引き数 Type に指定された値は、 SQL_COMMIT でも SQL_ROLLBACK でもありませんでした。 |
HY013 | 予期しないメモリーのハンドル・エラーが起きました。 | DB2 CLI は、関数の実行または完了をサポートするのに必要なメモリーを使用することができませんでした。 |
制約
なし。
SQLEndTran - 接続のトランザクションの終了を参照してください。
参照