我们已经实现了一个multi threaded
应用程序来更新数据库中表的列
即用户帐户余额。 hibernate用于将我们的应用程序与数据库进行交互。该应用程序部署在多个服务器中,并将作为群集运行。
假设发送多个请求以更新数据库中的同一用户帐户。我们怎么能处理这种情况呢?来自多个服务器的请求或来自同一服务器的不同线程将尝试同时更新此请求。如何确保操作的原子性。我们可以通过使用hibernate或spring framework
的数据库或行级锁来做同样的事情示例:
来自thread A
的{p> server S1
和来自thread B
的{{1}}在同时访问相同的server S2
。
首先,来自record R
的{{1}}会将thread A
的值更新为server S1
,R
更新R1
。
同时commit
的{{1}}将transaction
的值更新为thread B
,server S2
更新R
。
这种情况的结果是什么?我们必须锁定其中一个交易以获得正确的结果吗?我们如何锁定交易,因为它来自不同的服务器?。
答案 0 :(得分:0)
您可以使用Hibernate乐观锁定。
乐观锁定假定可以完成多个事务 而不会相互影响,因此交易可以 继续操作而不锁定它们影响的数据资源。之前 提交时,每个事务都会验证没有其他事务 修改了它的数据。如果支票显示相互矛盾的修改,那么 提交交易回滚[1]。
此处提供更多信息:https://docs.jboss.org/hibernate/orm/4.0/devguide/en-US/html/ch05.html
答案 1 :(得分:0)
对于您提到的方案,您需要考虑以下几点:
设置事务隔离级别。 Refer this link用于设置事务隔离级别。大多数情况下,READ COMMITTED
满足要求,但您也可以探索其他选项。
如果您有多个事务资源(如JMS),那么请考虑使用XA Transaction。即在您的配置中,您可以使用XA投诉数据库驱动程序。请参阅further details的此链接。 XA驱动程序提供了两阶段提交协议,可以保持事务的原子性。
如果您有EJB,那么container managed transaction
可以为您完成所有与事务相关的工作。 Refer this link for more