ページの先頭行へ戻る
Symfoware Server アプリケーション開発ガイド(埋込みSQL編)

2.3.3 SQL文の処理結果異常とトランザクション

データ操作のSQL文の処理中に異常が発生した場合には、アプリケーションにエラーで復帰します。エラーで復帰したときのトランザクションの状態は、エラーの原因がデッドロックによる場合と、そうでない場合によって異なります。エラーの原因を示すコードは、状態変数“SQLSTATE”に設定されます。

状態変数“SQLSTATE”に設定される値は、以下のとおりです。

エラー原因がデッドロックの場合のSQLSTATE:

40xxx

エラー原因がデッドロック以外の場合SQLSTATE:

40xxx以外

デッドロック以外のエラー発生時のトランザクション

エラーが発生したSQL文による更新は、そのSQL文を実行する直前の状態に戻されてアプリケーションへ復帰します。ただし、このSQL文の実行までに獲得されたデータベース資源の占有とカーソルの位置はそのまま保持されます。このとき、トランザクションは継続されたままになっています。トランザクションをそのまま継続させるか終了させるかは、エラーの原因ごとに利用者がアプリケーションの論理に従って決定します。たとえば、INSERT文で表にデータを繰り返し挿入するような処理では、あるデータが表の一意性制約に違反するエラーとなっても、そのデータを無視して引き続きデータを挿入すればよい場合には、トランザクションは継続させて処理を続行します。また、互いに関連のある複数の表を更新するような処理では、ある表の更新時にエラーが発生した場合、表の間での整合を保つために、ROLLBACK文を実行してトランザクションをロールバックします。

なお、動作環境ファイルのパラメタ“TRAN_SPEC”の指定により、トランザクションの対処方法を変更することができます。動作環境ファイルについては、“6.4 アプリケーションのチューニング”を参照してください。

データ操作のSQL文の実行でエラーが発生した場合の例を以下に示します。

図2.10 データ操作のSQL文の実行でエラーが発生した場合の例

デッドロックによるエラー発生時のトランザクション

エラーの原因がデッドロックによる場合は、トランザクションはロールバックされてアプリケーションへ復帰します。したがって、このSQL文の実行までに獲得されたデータベース資源のロックは解放され、オープン中のカーソルは閉じられます。

デッドロックが発生した場合のアプリケーションの対処方法については、“2.3.8 デッドロックの対処方法”で説明します。