选择未锁定的行oracle

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

是否有任何“翻译器”可以将此T-SQL(MS SQL Server)查询转换为Oracle方言?

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

我对Oracle缺乏这样的function感到有些失望。 他们想让我使用AQ或者什么?

Oracle确实具有此function,特别是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如果选择一个被锁定的行,则会出错。 那是你要的吗? 我很好奇你要解决的问题。 除非您有长时间运行的事务,否则从一个时刻到下一个时刻的锁定将是暂时的。

例:

CREATE TABLE TEST(COL1 NUMBER(10)NOT NULL,COL2 VARCHAR2(20 BYTE)NOT NULL);

在测试中创建独特的索引TEST_PK(COL1);

ALTER TABLE TEST ADD(CONSTRAINT TEST_PK PRIMARY KEY(COL1)使用INDEX TEST_PK);

SQL Session#1:SQL>插入测试值(1,’1111’); 已创建1行。 SQL>插入测试值(2,’2222’); 已创建1行。 SQL> commit; 提交完成。 SQL> update test set col2 =’AAAA’其中col1 = 1; 1行更新。

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

SQL> select * from test其中col1 = 1 for update nowait; select * from test其中col1 = 1表示update nowait * ERROR表示第1行:ORA-00054:资源繁忙,指定NOWAIT或超时已过期