我们如何处理hibernate中的并发事务

时间:2016-08-19 09:23:02

标签: java spring multithreading hibernate

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

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

假设发送多个请求以更新数据库中的同一用户帐户。我们怎么能处理这种情况呢?来自多个服务器的请求或来自同一服务器的不同线程将尝试同时更新此请求。如何确保操作的原子性。我们可以通过使用hibernate或spring framework

的数据库或行级锁来做同样的事情

示例

来自thread A的{​​p> server S1和来自thread B的{​​{1}}在同时访问相同的server S2

首先,来自record R的{​​{1}}会将thread A的值更新为server S1R更新R1

同时commit的{​​{1}}将transaction的值更新为thread Bserver S2更新R

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

2 个答案:

答案 0 :(得分:0)

您可以使用Hibernate乐观锁定。

  

乐观锁定假定可以完成多个事务   而不会相互影响,因此交易可以   继续操作而不锁定它们影响的数据资源。之前   提交时,每个事务都会验证没有其他事务   修改了它的数据。如果支票显示相互矛盾的修改,那么   提交交易回滚[1]。

此处提供更多信息:https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html

答案 1 :(得分:0)

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

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

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

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