选择未锁定的行oracle

本文关键字:oracle 锁定 选择 | 更新日期: 2023-09-27 17:50:13

我有一个使用Oracle数据库的c#应用程序。我需要一个查询,以获取解锁行从表在oracle数据库。如何选择所有未锁定的行?

是否有任何"翻译器"在那里,可以翻译这个T-SQL (MS SQL Server)查询Oracle方言?

SELECT TOP 1 * FROM TableXY WITH(UPDLOCK, READPAST);

我对Oracle缺少这样的功能有点失望。他们想让我用AQ还是什么?

选择未锁定的行oracle

Oracle确实有这个特性,特别是SELECT语句的SKIP LOCKED部分。引用:

SKIP LOCKED是处理争用事务的另一种方法这锁定了一些感兴趣的行。指定SKIP LOCKED来指示数据库试图锁定WHERE子句指定的行并跳过发现已被另一行锁定的任何行事务。

文档继续说它是为在多使用者队列中使用而设计的,但这并不意味着您可以在这个环境中使用它。虽然文档中这么说,但有一个很大的警告。您不能请求下N个未锁定的行,只能请求下N个未锁定的行,其中未锁定的行将被返回。

SELECT * 
  FROM TableXY 
 WHERE ROWNUM = 1
   FOR UPDATE SKIP LOCKED

请注意,如果你选择的表被锁定在排他模式下,即你已经指示数据库不要让任何其他会话锁定表,在排他锁被释放之前,你将不会得到任何返回的行。

我最近遇到了同样的问题,在解决了这个问题之后,我写了这个博客:

http://nhisawesome.blogspot.com/2013/01/how-to-lock-first-unlocked-row-in-table.html

欢迎留言!请多多指教。

简短总结:我不是选择第一个未锁定的记录并锁定它,而是选择一堆记录,然后遍历这堆记录并尝试使用SKIP LOCKED提示获取锁。如果所选的一个不可锁,则移动到下一个,直到获得锁或没有锁。

select for update nowait如果选择被锁定的行,将会报错。这就是你想要的吗?我很好奇你想解决什么问题。除非您有长时间运行的事务,否则行上的锁从一个时刻到下一个时刻都是瞬态的。

的例子:

创建TEST表(Col1编号(10)不为空,Col2 varchar2(20字节)不为空

);在TEST上创建唯一索引TEST_PK(COL1);

ALTER TABLE约束TEST_PK主键(COL1)使用索引test_pk

);

SQL会话#1:insert into test values(1,'1111');创建了1行。insert into test values(2,'2222');创建了1行。SQL>提交;提交完成。SQL> update test set col1= 'AAAA';1行已更新

SQL会话#2:尝试读取锁定行,得到错误:

SQL> select * from test where col1=1Select * from test where col1=1 for update nowait*第1行出现错误:ORA-00054:资源忙,获取时指定了NOWAIT或超时