0

我在 JasperReports 服务器电子邮件中收到以下错误:

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

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

设置事务隔离级别可重复读取
去
开始交易
...我的查询...
提交交易

我想知道这是否是解决错误的正确方法以及它是否有任何副作用?JasperReports 中的任何人都发生过这种情况吗?有谁知道这个问题是否存在更好的解决方案?

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

4

2 回答 2

1

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

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

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 回答