Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 如何回滚/超时Oracle中的“选择更新”锁?_Java_Oracle_Web Applications_Architecture_Pessimistic Locking - Fatal编程技术网

Java 如何回滚/超时Oracle中的“选择更新”锁?

Java 如何回滚/超时Oracle中的“选择更新”锁?,java,oracle,web-applications,architecture,pessimistic-locking,Java,Oracle,Web Applications,Architecture,Pessimistic Locking,我们的应用程序主要使用Hibernate版本控制支持的乐观锁定。我们计划在一个特定场景中实现悲观锁定。我对悲观锁定没有太多经验,所以如果这个问题听起来很幼稚,请原谅 当用户显示更新条目的意图时,我们使用“select for update”锁定相应的DB行。现在,如果这个用户花了很长时间提交他的更改,并且在锁定后忘记了它,那么我们如何使用一些超时/回滚机制来解锁这个锁呢?这样该行就不会长时间处于锁定状态,并且不允许所有其他用户对其进行编辑 我怀疑这是否会在我们正在使用的Weblogic JTA

我们的应用程序主要使用Hibernate版本控制支持的乐观锁定。我们计划在一个特定场景中实现悲观锁定。我对悲观锁定没有太多经验,所以如果这个问题听起来很幼稚,请原谅

当用户显示更新条目的意图时,我们使用“select for update”锁定相应的DB行。现在,如果这个用户花了很长时间提交他的更改,并且在锁定后忘记了它,那么我们如何使用一些超时/回滚机制来解锁这个锁呢?这样该行就不会长时间处于锁定状态,并且不允许所有其他用户对其进行编辑

我怀疑这是否会在我们正在使用的Weblogic JTA Spring事务机制中得到处理——我们已经有了30分钟的事务超时


因此,是否应该直接在Oracle级别处理此回滚。如果是的话,怎么办?请建议处理此问题的最佳方法,以避免此类锁停留时间过长。

只有在事务结束时才会释放锁。当向数据库发出显式提交或回滚时,或者当执行隐式回滚的数据库会话终止时,事务将结束。如果您的中间层已设置为回滚任何打开时间超过30分钟的事务,则足以释放锁


但是,如果您有一个Java应用程序在Weblogic应用程序服务器中运行,我觉得悲观锁定是不寻常的。首先,我假设您在中间层使用连接池。如果是这种情况,那么在这种情况下,中间层需要保持连接池中的一个数据库连接,其事务长度最长可达30分钟。但是,允许一个会话将特定的数据库会话保持打开状态一段较长的时间,会破坏建立连接池的目的。通常,几十个(如果不是几百个)应用程序会话可以共享连接池中的一个连接-如果要允许悲观锁定,现在,您正在强制应用程序会话和这些会话的数据库会话之间建立1:1的关系。

在许多情况下,乐观锁定无法取代悲观锁定。锁定超时在数据库中处理。请参阅本页,了解如何在Oracle中配置它


如果会话在数据库级别关闭,则丢弃所有行锁。这个级别的会话超时是多少?好的,我做了一些搜索,得到了以下结果:选择PROFILE,限制DBA_PROFILES,其中RESOURCE_NAME='IDLE_TIME';在我们的数据库上说无限-我想这意味着没有会话超时。对吗?您可以将相当于回调函数的函数传递给您的方法,该方法轮询执行它所花费的时间。一旦达到x秒,您将回滚会话。。。或者类似的,谢谢。是的,我认为我们不能两全其美。让Weblogic管理我们的jdbc会话,然后挑选一些来管理我们自己的悲观锁定。