错误:由SQLServerException引起:事务(进程ID 58)已死锁

时间:2010-05-05 08:55:19

标签: sql sql-server transactions jasper-reports jasperserver

我在JasperReports Server电子邮件中收到以下错误:

错误:由SQLServerException引起:事务(进程ID 58)在线程|上死锁与另一个进程通信缓冲资源并被选为死锁牺牲品。重新运行该交易。

报告中使用的查询非常复杂(对我而言)。阅读不同的帖子我得出结论,要解决这个问题,我必须将查询更改为

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

我想知道这是否是解决错误的正确方法,如果它有任何副作用?它是否发生在JasperReports的任何人身上?有谁知道问题是否存在更好的解决方案?

(虽然我尚未测试上述解决方案,但如果有人能对此提供任何见解将会有所帮助。)

2 个答案:

答案 0 :(得分:1)

编辑:对SQL Server使用SNAPSHOT隔离。

Saky,使用READ UNCOMMITTED,而不是REPEATABLE READ。如果您有一个支持多版本行并发的数据库,您可能可以使用READ COMMITTED,或者在MS SQL中使用SNAPSHOT隔离,这比READ COMMITTED更强,因为它使查询返回在查询时提交的结果已启动,因此对某些相互关联的行的任何部分更改都不会出现不一致,但不会阻止其他任何查询或对记录的更改。

REPEATABLE READ在某些RDBMS平台上的并发效果不佳,因此您可能会遇到死锁。你的RDBMS是什么?

答案 1 :(得分: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的情况下编写的。