2

我收到以下 Spring Framework 错误消息:

Invocation of getLogoForGlobalConext() in class $Proxy44 threw exception
org.springframework.transaction.UnexpectedRollbackException:
Transaction rolled back because it has been marked as rollback-only
at template/includes/macros.vm line 1651, column 43

我打开macros.vm并查看了第 1651 行,它看起来像这样:

#set ($globalLogo = $spaceManager.getLogoForGlobalContext());

根据我的研究,它看起来$Proxy44实际上是$spaceManager变量(或 的实例DefaultSpaceManager.java)。

当网络应用程序尝试下载位于网络服务器/数据库某处的图像/附件时,此消息会随机出现。

附件管理器由 Spring 的事务管理管理,下载图像/附件时使用以下事务属性:

  1. 传播 - 附件管理器中的所有方法

  2. 传播和只读 - 适用于附件管理器中以“get”开头的所有方法。

这些属性在Spring Framework - Chapter 9. Transaction management中定义。我在想的是我需要为事务设置超时(比如将其设置为无穷大)。

4

1 回答 1

2

事实证明,getter 方法之一是执行对数据库的写入。具体来说,它每隔几分钟就会用一些信息更新缓存。当此更新发生时,UnexpectedRollbackException被抛出。由于该事务应该是由上述事务属性定义的“只读”,因此我们不允许在 getter 操作期间执行更新。

我将 getter 方法更改为不对缓存执行任何更新,并且即使缓存过期也只需使用缓存,错误就会消失。

希望这对其他人有帮助。

于 2012-01-21T00:20:21.550 回答