【问题标题】:Synchronizing spring transaction同步spring事务
【发布时间】:2011-08-18 15:51:35
【问题描述】:

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

提前感谢您的帮助。

【问题讨论】:

    标签: java hibernate spring spring-transactions


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      我猜你需要在 Hibernate 端 configure optimistic locking

      【讨论】:

        猜你喜欢
        • 2018-05-01
        • 2018-08-03
        • 2012-06-03
        • 2012-03-03
        • 2015-06-08
        • 2020-03-07
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多