ORACLE PL/SQL:在Oracle SQL Developer中测试SELECT FOR UPDATE

3

我们目前正在尝试使用SELECT FOR UPDATE来锁定行。如果我运行:

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

我在 ORACLE SQL Developer 中没有得到任何返回结果,这不应该会抛出一个错误吗?这与使用相同的用户 ID 有关吗?

2个回答

6
你所说的“我得不到任何返回结果”是指两个查询都没有返回任何行吗?如果是,那表明该表中没有具有该ROWID的行。你是指第一个(或第二个)语句永远不会返回吗?如果是这样,那么该会话会被阻塞,等待获取锁。
锁由会话持有。如果两个语句在同一会话中运行,则第二个语句将成功,因为第一个语句已经获得了锁。如果第二个语句在由同一用户打开的不同会话中运行,则应生成一个异常,指出该行已经被另一个会话锁定。

我的最初想法是,由于我正在使用相同的连接,它只是在覆盖。你已经确认了这一点。谢谢。 - jlrolin

2

在同一事务中,您已经锁定了一个表并请求再次锁定该表。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接