当前位置: 首页 > 知识库问答 >
问题:

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

邢起运
2023-03-14

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

当用户显示更新条目的意图时——我们使用“选择更新”锁定相应的数据库行。现在,如果该用户花了很长时间提交他的更改,但在锁定后忘记了它,我们如何使用一些超时/回滚机制解锁此锁?这样该行就不会长时间保持锁定,并禁止所有其他用户对其进行编辑。

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

那么,是否应该直接在Oracle级别处理此回滚。如果是,那么如何处理?请建议处理此问题的最佳方法,以便此类锁不会逗留太久。

共有2个答案

霍财
2023-03-14

乐观锁定无法取代悲观锁定的情况很多。锁定超时在数据库中处理。有关如何在Oracle中配置它,请参阅此页

Oracle的默认对象锁超时可以更改吗?

劳昊明
2023-03-14

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

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

 类似资料:
  • 这是我的伪代码: 我想问,如果条件等于“key”的行已经被删除,那么“select for update”阻止的锁是否可以自动解锁,这意味着如果另一个进程在此点进入并选择相同的“key”,它就不能被此进程阻止?

  • 问题内容: 我正在创建许多脚本,有时要检查表是否根据需要进行更新,我即时编写了一些SELECT语句。 在SQL SERVER中,您可以编写如下内容: 出于可见性原因,这很有用,但是在ORACLE中似乎不起作用,我不知道如何实现,除了手动写下所有列名。 您如何在oracle中做到这一点? 我知道我们不应该在生产脚本等中包含这样的查询。在开发中运行脚本时,我只是想即时使用它。在不同的点上,我更感兴趣的

  • 我有一个包含两列的表:k(主键)和value。我想: 选择k进行更新,如果找不到k,则插入默认值的新行。 对返回的值(存在的或新插入的行值)进行一些处理。 更新行并提交。 是否可以使此“选择更新并在未找到时插入默认值”? 如果将(1)实现为select/check if found/insert if not found,我们会遇到并发问题,因为两个会话可能会在不存在的键上并发地进行选择,两个会话

  • 我仍然是新的laravel(5.5),我有一个问题,当我更新用户记录,错误是: SQLSTATE[23000]:完整性约束冲突:1048列“部门”不能为空(SQL:updateset=$2y$10$j5wfEZ3N7SYDzWA10hbAguY9o6jY.xk1vfUEw0mBmc0351ZHaYDiy,=,=12345,=2018-09-11 00:52:20,=其中=1) recordscon

  • 问题内容: 我创建了以下示例,以便您可以确切了解正在发生的事情:http : //jsfiddle.net/8t2Ln/101/ 如果我使用ng-options,也会发生同样的事情。我这样做有不同的原因,但由于简化了示例,所以省略了这一部分。 如您所见,默认情况下它具有两个选项。我将在选择旁边显示ng- model的选择值,以便您可以看到它的含义。当您在顶部添加第三个选项时,它会将值设置为该新选项

  • 问题内容: 有没有简单的方法来选择更新的行? 我试图每次读取行时都存储时间戳,以便能够删除长时间未读取的数据。 首先,我首先尝试执行查询,甚至发现有点慢但是简单的解决方案,例如 但我仍然想找到一种正常的方法来做到这一点。 我还认为先更新时间然后选择更新的行应该容易得多,但是即使如此,我也没有找到任何东西 问题答案: 声明该列,如下所示: 然后,每当更新一行时,该列就会自动更新。 更新: 我认为没有