在seeion中的oracle行级别锁定,不会将错误引发到其他会话

时间:2017-02-19 07:25:34

标签: oracle concurrency locking

我在第1节中有这个查询:    从x中选择*,其中x.id = 625用于更新nowait; 我在会话2中有另一个查询:      更新x设置x.code = 0,其中id = 625; 我不希望会话2等待会话1提交或回滚。 我想将错误提交到会话2,直到会话1未提交。 我的问题是会话2等待会话1释放资源。

1 个答案:

答案 0 :(得分:3)

在会话2中,您需要发出另一个SELECT FOR UPDATE NOWAIT以获取记录上的锁定,然后在同一事务中进行更新。

SELECT FOR UPDATE语句必须使用与WHERE相同的UPDATE条件才能锁定您要更新的相同记录。

如果记录已被锁定,则第一个SELECT FOR UPDATE投掷:
ORA-00054:资源繁忙并在指定NOWAIT或超时过期时获取

SELECT 1 FROM x WHERE id = 625 FOR UPDATE NOWAIT;
update x set x.code = 0 where id = 625 ;