0

JasperReports Server の電子メールに次のエラーが表示されました。

エラー: SQLServerException が原因: トランザクション (プロセス ID 58) がスレッドでデッドロックされました | バッファ リソースを別のプロセスと通信しており、デッドロックの犠牲者として選択されています。トランザクションを再実行します。

レポートで使用されるクエリは非常に複雑です (私にとって)。さまざまな投稿を読んで、これを解決するには、クエリを次のように変更する必要があると結論付けました

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
行く
取引開始
...私のクエリ...
コミットトランザクション

これがエラーを解決する正しい方法であり、副作用があるかどうか疑問に思いますか? JasperReports の誰かに起こったことはありますか? 問題に対するより良い解決策が存在するかどうかを誰かが知っていますか?

(私はまだ上記の解決策をテストしていませんが、誰かがこれについて洞察を与えることができれば役に立ちます。)

4

2 に答える 2

1

編集:SQLServerでSNAPSHOT分離を使用します。

Saky、REPEATABLE READではなく、READUNCOMMITTEDを使用してください。マルチバージョン行の同時実行をサポートするデータベースがある場合は、READ COMMITTEDを使用できる場合があります。または、MS SQLの場合と同様に、SNAPSHOT分離を使用できます。これは、クエリがクエリ時にコミットされた結果を返すため、READCOMMITTEDよりも強力です。が開始されるため、相互に関連する一部の行への部分的な変更に矛盾はありませんが、他のクエリやレコードへの変更をブロックすることはありません。

一部のRDBMSプラットフォームでは、REPEATABLE READは同時実行ではうまく機能しないため、デッドロックが発生する可能性があります。あなたのRDBMSは何ですか?

于 2010-09-17T18:44:14.137 に答える
0

JasperReports で使用する接続を定義する場合。私は通常、次のようにトランザクション分離を設定します。

//get the connection object (or create it, however you do it)
Connection conn = getConnectionToDatabase();

//set Transaction Isolation
conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITED);

//Also, set Holdability to HOLD (holds the ResultSet when connection is committed.
conn.setHoldability(ResultSet.HOLD_CURSORS_OVER_COMMIT);



注:変数/メソッド名を確認してください。これはIDEなしで書きました。

于 2010-05-05T10:58:51.503 に答える