Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我们如何在hibernate中处理并发事务_Java_Spring_Multithreading_Hibernate - Fatal编程技术网

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

Java 我们如何在hibernate中处理并发事务,java,spring,multithreading,hibernate,Java,Spring,Multithreading,Hibernate,我们实现了一个多线程应用程序,用于更新数据库中表的一列 即,用户帐户余额。hibernate用于将应用程序与数据库交互。该应用程序部署在多台服务器中,并将作为一个群集运行 假设发送多个请求以更新数据库中的同一用户帐户。我们如何处理这种情况?来自多个服务器或来自同一服务器的不同线程的请求将尝试同时更新此内容。如何确保操作的原子性。我们可以使用hibernate或spring框架通过数据库表或行级锁实现同样的功能吗 示例: 来自服务器S1的线程A和来自服务器S2的线程B在同时访问相同的记录R 首先,

我们实现了一个
多线程
应用程序,用于更新数据库中表的一列

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

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

示例

来自
服务器S1的线程A
和来自
服务器S2的
线程B
同时访问相同的
记录R

首先,来自
服务器S1的
线程A
R
的值更新为
R1
提交
事务

同时,来自
服务器S2的
线程B
R
的值更新为
R2
提交
事务


这种情况的结果是什么?。为了获得正确的结果,我们必须锁定一个事务?。由于事务来自不同的服务器,我们如何锁定它?

您可以使用Hibernate乐观锁定

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


<> p>以上信息:

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

  • 设置事务隔离级别。用于设置事务隔离级别。大多数情况下,
    readcommitted
    满足要求,但您也可以探索其他选项

  • 如果您有多个事务资源,比如JMS,那么可以考虑使用XA事务。i、 e.在您的配置中,您可以使用XA DB驱动程序。有关详细信息,请参阅此链接。XA驱动程序提供了两阶段提交协议,该协议维护事务的原子性

  • 如果您有EJB,那么
    容器管理的事务
    可以为您完成所有与事务相关的工作


  • 如何从不同服务器的并发访问中确保记录的原子性。即,来自服务器S1的线程A和来自服务器S2的线程B同时访问相同的记录R。首先,来自服务器S1的线程A将R的值更新为R1并提交事务。同时,来自服务器S2的线程B将R的值更新为R2并提交事务。我们如何使用hibernate或spring来处理这个问题。如果没有hibernate或spring,您将如何处理它?请把你到目前为止所研究的内容发出来,因为目前形式的问题相当广泛,我担心你不会得到准确的答案。