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

JPA:Oracle中使用select for update对行进行悲观锁定

夹谷茂
2023-03-14

我得到了一个包含如下数据的oracle表:

表:

create table myobjects(id int, objname varchar(20), state int);

数据:

id / objname / state
1 / 'object no. 1' / 2
2 / 'object no. 2' / 1
3 / 'object no. 3' / 1
4 / 'object no. 4' / 1
5 / 'object no. 5' / 1
6 / 'object no. 6' / 1
7 / 'object no. 7' / 1

现在我有多个批处理实例

  1. 锁定表的一个对象行,状态 = 1(语句应返回最多一个对象行,可以找到的第一个可用/未锁定的对象行,如果没有可用的行,则返回没有行)
  2. 将对象行的状态设置为 2,提交,
  3. 对该行执行一些工作,将状态设置为 3 并提交。

为了生成语句,我使用 openjpa...但如果有必要,Oracle Native 语句也是可能的。

对于第一步。,我试过这种说法:

select * from myobjects where state = 1 and rownum <= 1 for update skip locked;

==

因此,第一批实例将锁定所有对象--

我能想到的另一种可能性(回退)是选择(例如)状态为1的10行而不锁定,然后通过id锁定一行:

select * from myobjects where state = 1 and rownum <= 10;
-- 'try and error' locking with all of them
select * from myobjects where id = :id for update;

==

你能帮我找到一个更好的解决方案吗?

先谢谢你。

备注:请:解决方案,仅限不带存储过程的解决方案。

共有1个答案

凌朗
2023-03-14

PL/SQL 允许吗?

declare
   id int;
begin
   update myobjects
   set state=2
   where state = 1
   and rownum = 1 
   returning id into id;

   commit;

   dbms_output.put_line(id);
end;

它为我使用2个独立的SQL开发会话。

 类似资料:
  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁与悲观锁的具体区别: http://www.cnblogs.com/Bob-FD/p/3352216.html

  • 问题内容: 我在java下有spring项目,使用hibernate查询,我喜欢使用悲观锁定。 在Spring + Hibernate中如何进行悲观锁定? 编辑: 问题: 我想在一个方法中使用悲观锁定,并且我将此方法称为从不同的方法。当我从第一个方法调用它时,悲观的工作效果很好,但是当我从第二个方法调用它时,它给出了(无法提交事务) 例外: 问题答案: http://www.amicabile.c

  • 我上面代码的日志是: 数据库也会更新。为什么lock()不工作?不是在lock()之后其他实例无法更新吗?还是别的什么?还是我错过了什么?

  • 本文向大家介绍说一下乐观锁和悲观锁?相关面试题,主要包含被问及说一下乐观锁和悲观锁?时的应答技巧和注意事项,需要的朋友参考一下 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻止,直到这个锁被释放。 数据库的乐观锁需要自

  • 锁模式、和用于立即获得长期数据库锁。 我假设悲观的锁总是会触发数据库上的SQL,不管使用什么锁模式。现在有三个问题: 假设是否正确,或者如果正确,此规则是否有例外? 给定锁定了行。锁定行不能被任何其他事务更新,但锁定行的事务除外? 可以通过对事务执行提交或回滚来释放锁。如果应用程序(以及锁定行的事务)突然终止,而没有对事务执行提交或回滚,那么锁会发生什么情况?

  • 嗨, 我们有一个应用程序(J2EE/Hibernate/JPA),其中有几个用户在一个公共实体上执行操作。 句子是单独的实体 几个用户同时更新同一句话的几率很低 在这种情况下,其中一个用户可以收到消息“对不起另一个用户试图编辑相同的句子” 到目前为止还不错。 但是现在,我们已经为这个应用程序添加了后台进程(相当快的进程)。他们经常做出改变(假设它将一个词的出现替换为另一个词)。 这是不能接受的向用

  • 我使用SpringDataJPA和Hibernate作为PostgreSQL上的持久性提供者。我试图提供悲观锁定: 我尝试从两个线程中调用< code>findOneAndLock。我认为,如果< code >线程A锁定了对象,那么< code >线程B应该等到锁被释放。而是< code >线程B抛出< code > org . spring framework . ORM . objectopt

  • 我试图理解Hibernate中的悲观锁定机制(通过MySQL DB)。 我尝试运行以下示例: 但它并没有给我一个错误,而是执行得很好。是不是我误解了什么概念。这种行为正常吗? 我能够完美地测试乐观锁定,那么对于悲观锁定,是对概念有一些误解,还是我的代码缺少了一些东西。