我在JasperReports Server电子邮件中收到以下错误:
错误:由SQLServerException引起:事务(进程ID 58)在线程|上死锁与另一个进程通信缓冲资源并被选为死锁牺牲品。重新运行该交易。
报告中使用的查询非常复杂(对我而言)。阅读不同的帖子我得出结论,要解决这个问题,我必须将查询更改为
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ GO BEGIN TRANSACTION ... my query ... COMMIT TRANSACTION
我想知道这是否是解决错误的正确方法,如果它有任何副作用?它是否发生在JasperReports的任何人身上?有谁知道问题是否存在更好的解决方案?
(虽然我尚未测试上述解决方案,但如果有人能对此提供任何见解将会有所帮助。)
答案 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的情况下编写的。