【问题标题】:how can we handle concurrent transactions in hibernate我们如何在休眠中处理并发事务
【发布时间】:2016-12-26 09:43:17
【问题描述】:

我们已经实现了一个multi threaded 应用程序来更新数据库中表的列

即,用户帐户余额。 hibernate 用于将我们的应用程序与数据库进行交互。该应用程序部署在多个服务器中,并将作为一个集群工作。

假设发送多个请求以更新数据库中的同一用户帐户。我们该如何处理这种情况?来自多个服务器的请求或来自同一服务器的不同线程将尝试同时更新它。如何保证操作的原子性。我们可以通过使用hibernate或spring框架的数据库表或行级锁来做同样的事情吗

示例

来自server S1thread A 和来自server S2thread B同时访问同一个record R

首先将thread Aserver S1 更新为R 的值R1commit transaction

同时thread Bserver S2更新R的值到R2committransaction

这种情况的结果是什么?我们必须锁定其中一项交易以获得正确的结果?我们如何锁定事务,因为它来自不同的服务器?

【问题讨论】:

  • 如果没有 hibernate 或 spring,你将如何处理它?请张贴您目前所研究的内容,因为当前表格中的问题非常广泛,恐怕您不会得到准确的答案。

标签: java spring multithreading hibernate


【解决方案1】:

您可以使用 Hibernate 乐观锁定。

乐观锁假设多个事务可以完成 不会相互影响,因此交易可以 在不锁定它们影响的数据资源的情况下继续。前 提交,每个事务验证没有其他事务有 修改了它的数据。如果检查显示有冲突的修改,则 提交事务回滚[1]。

更多信息在这里:https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html

【讨论】:

  • 我们如何确保来自不同服务器的并发访问记录的原子性。 IE。来自服务器 S1 的线程 A 和来自服务器 S2 的线程 B 同时访问同一记录 R。首先,来自服务器 S1 的线程 A 将 R 的值更新为 R1 并提交事务。同时,来自服务器 S2 的线程 B 将 R 的值更新为 R2 并提交事务。我们如何使用hibernate或spring来处理这个问题。
【解决方案2】:

对于您提到的场景,您需要考虑以下几点:

  1. 设置事务隔离级别。 Refer this link 用于设置事务隔离级别。大多数情况下,READ COMMITTED 足以满足要求,但您也可以探索其他选项。

  2. 如果您有多个事务资源(如 JMS),那么请考虑使用 XA 事务。即在您的配置中,您可以使用 XA 投诉数据库驱动程序。请参阅此链接以获取 further details 。 XA 驱动程序提供两阶段提交协议,可维护事务的原子性。

  3. 如果您有 EJB,那么container managed transaction 可以为您完成所有与事务相关的工作。 Refer this link for more

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2018-08-30
    • 2016-03-19
    • 2021-02-21
    相关资源
    最近更新 更多