我们在项目中使用 Spring 和 Hibernate,并具有分层架构。控制器 -> 服务 -> 管理器 -> 道。事务从 Manager 层开始。服务层中更新数据库中对象的方法被许多线程调用,这导致抛出一个过时的对象期望。所以我把这个方法同步了,仍然看到抛出过时的对象异常。我在这里做错了什么?有没有更好的方法来处理这种情况?
我在这里先向您的帮助表示感谢。
我们在项目中使用 Spring 和 Hibernate,并具有分层架构。控制器 -> 服务 -> 管理器 -> 道。事务从 Manager 层开始。服务层中更新数据库中对象的方法被许多线程调用,这导致抛出一个过时的对象期望。所以我把这个方法同步了,仍然看到抛出过时的对象异常。我在这里做错了什么?有没有更好的方法来处理这种情况?
我在这里先向您的帮助表示感谢。
当实体在读取和更新之间被修改时,会引发过时对象异常。这可能发生在单个事务中,但也可能发生在您读取事务中的对象,修改它(例如在控制器层中),然后启动另一个事务并合并/更新它(在这种情况下,几分钟或几小时)可以将读取和更新分开)。
抛出异常是为了帮助您避免用户之间的冲突。
如果您不关心冲突(即最后一次更新总是胜出并替换之前写入的内容),那么不要使用乐观锁定。如果您担心冲突,则会发生 StaleObjectExceptions,您应该向最终用户弹出一条有意义的消息,要求他重新加载数据并尝试再次修改。没有办法避免它们。您必须保持乐观,并希望它们不会经常发生。
请注意,您的同步技巧仅在以下情况下才有效
它还可能会显着降低吞吐量,因为您禁止任何并发更新,无论并发事务更新了哪些实体。就像您在整个事务期间锁定整个表一样。
我的猜测是您需要在 Hibernate 端配置乐观锁定。