1

我们在项目中使用 Spring 和 Hibernate,并具有分层架构。控制器 -> 服务 -> 管理器 -> 道。事务从 Manager 层开始。服务层中更新数据库中对象的方法被许多线程调用,这导致抛出一个过时的对象期望。所以我把这个方法同步了,仍然看到抛出过时的对象异常。我在这里做错了什么?有没有更好的方法来处理这种情况?

我在这里先向您的帮助表示感谢。

4

2 回答 2

4

当实体在读取和更新之间被修改时,会引发过时对象异常。这可能发生在单个事务中,但也可能发生在您读取事务中的对象,修改它(例如在控制器层中),然后启动另一个事务并合并/更新它(在这种情况下,几分钟或几小时)可以将读取和更新分开)。

抛出异常是为了帮助您避免用户之间的冲突。

如果您不关心冲突(即最后一次更新总是胜出并替换之前写入的内容),那么不要使用乐观锁定。如果您担心冲突,则会发生 StaleObjectExceptions,您应该向最终用户弹出一条有意义的消息,要求他重新加载数据并尝试再次修改。没有办法避免它们。您必须保持乐观,并希望它们不会经常发生。

请注意,您的同步技巧仅在以下情况下才有效

  • 只有在同一事务中读取和写入时才会发生异常
  • 实体的更新仅由该服务进行
  • 您的应用程序没有集群。

它还可能会显着降低吞吐量,因为您禁止任何并发更新,无论并发事务更新了哪些实体。就像您在整个事务期间锁定整个表一样。

于 2011-08-18T16:46:44.123 回答
1

我的猜测是您需要在 Hibernate 端配置乐观锁定

于 2011-08-18T16:22:35.080 回答