2011-01-12 93 views
3

我们目前正试图实现SELECT FOR UPDATE来锁定行。如果我运行:ORACLE PL/SQL:在Oracle SQL Developer中测试SELECT FOR UPDATE

SELECT * FROM data where rowid = 'AAAQA5AAGAACNbEAA1' FOR UPDATE; 
SELECT * FROM data where rowid = 'AAAQA5AAGAACNbEAA1' FOR UPDATE NOWAIT; 

我在ORACLE SQL Developer中没有得到任何回报。这不应该给我一个错误?这是否与使用相同的用户ID有关?

回答

5

你说的“我得不到任何回报。”是什么意思?你的意思是这两个查询都不返回任何行吗?如果是这样,那意味着表中没有具有该ROWID的行。你的意思是第一个(或第二个)声明永远不会返回?如果是这样,会话被阻止,等待获得锁。

锁定按会话进行。如果两个语句在同一个会话中运行,则第二个语句将成功,因为第一个语句已经获得该锁。如果第二条语句在恰好由同一用户打开的不同会话中运行,则应该生成该行已被另一个会话锁定的异常。

+0

我最初的想法是,因为我正在关闭同一个连接,所以这只是覆盖。你已经证实了。谢谢。 – jlrolin 2011-01-13 14:29:45

1

您要求在已锁定的表上锁定事务。

您需要从不同的连接(即不同的事务)运行第二个SELECT

+0

这就是我认为......谢谢。 – jlrolin 2011-01-12 20:42:53