【问题标题】:How to manage the concurrency using hibernate Transaction API如何使用 hibernate Transaction API 管理并发
【发布时间】:2018-03-18 18:52:08
【问题描述】:

我有在分布式环境中运行的应用程序。 我想要一个场景,比如两个同时请求来更新表格。如果第一个请求成功更新表,则下一个请求不应执行/丢弃某些消息。因此用户必须再次加载更新的数据并再次进行更新操作。 解决方案 我发现一个常见的解决方案是版本控制,方法是在表中添加一个键作为版本,并在每次更新表时进行比较。

我正在寻找其他一些解决方案,因为 Hibernate 是一个健壮的框架,会有其他方法来实现这个解决方案。

通过阅读 JBoss 的一篇文章,有一种称为事务 API 的东西,我们也可以通过它实现,但不清楚如何实现解决方案。

【问题讨论】:

    标签: java hibernate jpa concurrency distributed-transactions


    【解决方案1】:

    Hibernate 可以使用乐观和悲观锁定,如 official documentation, Chapter 5. Locking 中所述。

    如果您的数据库实体没有竞争,那么使用@Version 列进行优化锁定似乎是正确的方法。如果您需要悲观锁定检查LockMode 类。另一种选择是使用SELECT FOR UPDATE 语句,如果它在您的数据库中可用。然而,所有悲观锁定方法通常比简单的乐观锁定解决方案更昂贵,因为在后台会发生额外的数据库操作。

    【讨论】:

    • 如果你能帮助我使用任何其他方法,我已经完成了版本控制方法
    • 查看Session.lock() 方法文档并查看您的RDBMS 提供了什么,例如PostgreSQL 有一整章关于锁定:postgresql.org/docs/10/static/explicit-locking.html。多个资源上的分布式事务是一个完全不同的概念,请参阅 XA 或 2PC-best-effort 方法。
    • docs.jboss.org/hibernate/orm/5.2/userguide/html_single/… 请查看我们可以通过 TransactionCoordinatorBuilder 实现的链接,但没有获取如何配置的源代码。
    • 锁定不是事务协调。您可以拥有本地资源(1PC)或分布式事务(2PC,通常是 XA over JTA)。除非您正在编写自己的 JTA 实现,否则您的文档看起来就像您通常不会在应用程序中触及的内容。请注意,我从未使用过TransactionCoordinatorBuilder,所以我可能在这里错了。
    • 我将从概述开始:javaworld.com/article/2077963/open-source-tools/…。比我深入研究 XA 并了解 XA 在哪些条件下会失败,例如永久资源故障。比查看哪些资源不支持 XA,例如像 RabbitMQ 这样的 AMQP 队列以及原因(通常是性能)。理想情况下,您还想了解数据库中的事务保存点:postgresql.org/docs/10/static/sql-savepoint.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2018-12-22
    相关资源
    最近更新 更多