我们在我们的项目中使用Spring和Hibernate,并且具有分层的架构。控制器服务->管理器-> Dao。事务从Manager层开始。服务层中更新db中的对象的方法被许多线程调用,这导致抛出陈旧的对象预期。所以我同步了这个方法,但仍然看到抛出了陈旧的对象异常。我在这里做错了什么?有没有更好的方法来处理这个案子?
提前感谢您的帮助。
发布于 2011-08-19 00:46:44
当一个实体在被读取和更新之间被修改时,就会抛出过时的对象异常。这可能发生在单个事务内,但也可能发生在读取事务中的对象,修改它(例如,在控制器层),然后启动另一个事务并合并/更新它(在这种情况下,分钟或小时可以分离读取和更新)。
抛出异常是为了帮助您避免用户之间的冲突。
如果你不关心冲突(也就是说,最后一次更新总是成功的,并且替换了之前的更新),那么就不要使用乐观锁定。如果您担心冲突,那么StaleObjectExceptions就会发生,您应该向最终用户弹出一条有意义的消息,要求他重新加载数据并再次尝试修改它。它们是无法避免的。你必须保持乐观,并希望这种情况不会经常发生。
请注意,您的同步技巧只有在以下情况下才有效
它还可能显著降低吞吐量,因为您禁止任何并发更新,而不管并发事务更新了哪些实体。这就好比在整个事务期间锁定了整个表。
发布于 2011-08-19 00:22:35
我的猜测是,您需要在Hibernate端使用configure optimistic locking。
https://stackoverflow.com/questions/7110331
复制相似问题