• 検索結果がありません。

トランザクション終了漏れによるアプリケーション無応答について

ドキュメント内 Symfoware Server べからず集 (ページ 159-162)

9. アプリケーション開発時の注意を怠るべからず

9.2. トランザクション終了漏れによるアプリケーション無応答について

9.2.1. 留意点

【概要】

トランザクション終了の操作が漏れるとトランザクションによる排他が残り、他のトランザ クションを実行しているアプリケーションが無応答になることがあります。

トランザクションは適切なタイミングで終了させることで、他のアプリケーションの余分な 排他待ちを解消することができます。

【詳細】

Symfoware では、トランザクション単位にデータベースの更新を行い、複数のトランザク

ションが同時に同じデータを参照・更新した際に矛盾を起こさないよう、トランザクション による排他制御を行っています。

このため、アプリケーションの中でトランザクション終了の操作が漏れていた場合に、トラ ンザクションによる排他が残ったままとなり、他のアプリケーションのトランザクションが 待たされて無応答になるトラブルが発生します。この事象を回避するには、トランザクショ ン終了の操作を適切なタイミングで行う必要があります。

 トランザクションの開始と終了

トラザクションの開始と終了契機は、アプリケーションの連携方法によって異なりま す。詳細は、「9.2.3. 備考」で示す各アプリケーション開発ガイドを参照してください。

連携方法 トランザクションの開始契機 トランザクションの終了契機

埋込みSQL データ操作のSQL文実行時 COMMITまたはROLLBACKの発行時

JDBC

・Connection.createStatement()など、Statementオブジェクト、

PreparedStatementオブジェクト、CallableStatementオブジェク トを作成するメソッドの実行時

・Statement.executeUpdate(String s)、

PreparedStatement.executeQuery()など、SQL文を実行するメソッ ドの実行時

・Connection.commit()または Connection.rollback()実行時

・自動コミット機能によるトラン ザクションの自動終了時

Symfowre .NET Data Provider

・トランザクションの終了契機をアプリケーション内で明示的に 操作する場合

Connection.BeginTransaction実行時

・トランザクションの終了契機をアプリケーション内で明示的に 操作しない場合(BeginTransactionを使用しない、または TransactionScopeを使用する場合)

SymfowareCommand.Prepareまたは、SymfowareCommand.executeXXX など、SQL文を実行するメソッドの実行時

・トランザクションの終了契機を アプリケーション内で明示的に 操作する場合

Transaction.Commitまたは Transaction.Rollback実行時

・トランザクションの終了契機を アプリケーション内で明示的に 操作しない場合

Symfoware Server べからず集 SQL文の処理完了後すぐコミッ

ODBC

・RDO/ADOの場合

Connection.BeginTrans、Connection.CommitTrans、または Connection.RollbackTransの実行時

・ADO.NETの場合

OdbcConnection.BeginTransaction、OdbcTransaction.Commit、ま たはOdbcTransaction.Rollbackの実行時

SQL文の処理完了後すぐにコミ ット

 注意点

以下の操作でトランザクションが終了するものと誤解されたトラブルが多々あります。

以下の操作ではトランザクションは終了しないこと、明示的な COMMIT や

ROLLBACKの発行が必要であることに注意してください。

- カーソルや結果セットのクローズ

 排他待ち状態の確認方法

トランザクションの終了漏れによる排他待ち状態は、以下の方法により検出できます。

(1) rdblkinf -l -e コマンドにより、他のコネクションを待たせているコネクション

(Status がACTIVE)を検出します。(待たされているコネクションの Status

はWAIT)

(2) rdbcninf -s コマンドにて、他のコネクションを待たせているコネクションがト

ランザクション中(TranがACT)、かつアイドル時間(Idle)が0でないかどう か、または極端に時間がかかっていないかを確認します。

$ rdblkinf -l -e

RDBII rdblkinf DATE:2014/04/14 TIME:11/35/50 DSI-name : DB0001.DSI0001

Status Uid Pid Sid Type Name Unit Purpose ACTIVE I4874 19656 1 SQL apl001/DEFAULT DSI REFER|UPDATE WAIT I4874 19641 2 SQL apl003/DEFAULT DSI REFER

Symfoware Server べからず集

上記(2)の条件に該当するコネクションは、トランザクションの終了漏れである可能性 があります。例えば、Idleが0でない場合、排他を残したまま1秒以上SQL文を発 行していないことになりますが、そのような動作を意図したアプリケーションでなけ れば、トランザクション終了漏れの可能性が高いと言えます。

また、トランザクション終了の操作が漏れていないアプリケーションで、極端に時間 がかかっているような長トランザクションは、他のアプリケーションを待たせる確率 が高くなるため、アプリケーションの業務内容を確認して、より適切なタイミングで トランザクションを終了するように見直すことが必要です。

9.2.2. 未対処時の影響 (1) 現象分類

アプリケーションの異常 (2) 現象/原因

アプリケーションから発行したSQL文が排他待ちになります。

他トランザクションの終了操作漏れのため、排他が残ったままになっているためです。

9.2.3. 備考

 Symfoware Server アプリケーション開発ガイド(共通編) 1.1 トランザクションと排他制御

 Symfoware Server アプリケーション開発ガイド(JDBCドライバ編) 2.3 トランザクション

 Symfoware Server アプリケーション開発ガイド(ODBCドライバ編) 2.3トランザクションと排他制御

 Symfoware Server アプリケーション開発ガイド(NET Data Provider編) 2.3 トランザクション

$ rdbcninf -s

RDBII rdbcninf DATE:2014/04/14 TIME:11/36/00

Local Connection Status(exec/term/free/total) : 2/ 0/ 30/ 32

Status Idle Tran Type Connection-Info EXEC 125:32 ACT SQL 19656/1

EXEC 00:00 ACT SQL 19641/2

Remote Connection Status(exec/term/free/total) : 0/ 0/ 32/ 32

Symfoware Server べからず集

ドキュメント内 Symfoware Server べからず集 (ページ 159-162)

Outline

関連したドキュメント