2010-05-05 134 views
0

我得到了下面的錯誤在我的JasperReports服務器的電子郵件:錯誤:由SQLServerException引起的:事務(進程ID 58)已被死鎖

錯誤:由SQLServerException引起的:事務(進程ID 58)已被死鎖的線程|通信緩衝區資源與另一個進程並被選爲死鎖受害者。重新運行交易。

在報告中使用的查詢非常複雜(對我而言)。讀不同的崗位我的結論是,解決這個我必須要改變的查詢

 
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 
GO 
BEGIN TRANSACTION 
... my query ... 
COMMIT TRANSACTION 

我不知道這是解決錯誤的正確方法,並且如果它有沒有副作用?它發生在JasperReports中的任何人嗎?有誰知道這個問題是否存在更好的解決方案?

(雖然我還沒有測試過上述方案,如果任何人都可以給這個任何見解將是有益的。)

+1

沒有足夠的信息來幫助你... – 2010-05-05 08:57:19

回答

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。

+0

由於我使用SQL查詢作爲數據源,我假設你;重新編碼是javabean數據源的一部分,在每個Select語句之前添加了「SET TRANSACTION ISOLATION LEVEL REPEATABLE READ」在XML報告中。但它沒有工作:( – Saky 2010-05-06 09:56:18

1

編輯:使用SNAPSHOT隔離與SQL Server。

Saky,使用READ UNCOMMITTED,不可重複讀。如果您有一個支持多版本行並行的數據庫,則可以使用READ COMMITTED或MS SQL SNAPSHOT隔離,這比READ COMMITTED更強大,因爲它使查詢返回查詢時提交的結果因此對某些相關行的任何部分更改都不會有不一致性,但它會阻止其他任何其他查詢或對記錄的更改的其他任何查詢或更改。

對於某些RDBMS平臺上的併發,REPEATABLE READ不能很好地工作,所以您可能會遇到死鎖。你的RDBMS是什麼?

+0

異常表明MS SQL Server,所以你應該確保啓用SNAPSHOT併發,並使用它。http://msdn.microsoft.com/en-us/library/ms189122.aspx – jbindel 2010-09-17 18:46:13

相關問題