2010-05-05 64 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

相关问题