seesion中的oracle行级锁定不会向其他会话引发错误
我在第1课时提出了这个问题: 从x中选择*其中x.id=625用于更新nowait强> 我在第2课时还有一个问题: 更新x集x.code=0,其中id=625强> 我不希望会话2等待会话1提交或回滚。 我想在会话1未提交之前将错误提交到会话2。seesion中的oracle行级锁定不会向其他会话引发错误,oracle,concurrency,locking,Oracle,Concurrency,Locking,我在第1课时提出了这个问题: 从x中选择*其中x.id=625用于更新nowait 我在第2课时还有一个问题: 更新x集x.code=0,其中id=625 我不希望会话2等待会话1提交或回滚。 我想在会话1未提交之前将错误提交到会话2。 我的问题是会话2等待会话1释放资源。在会话2中,您需要发出另一个选择for UPDATE NOWAIT,以获得对记录的锁定,然后在同一事务中执行更新。 SELECT FOR UPDATE语句必须使用与UPDATE相同的WHERE条件,以锁定要更新的相同记录。 如
我的问题是会话2等待会话1释放资源。在会话2中,您需要发出另一个
选择for UPDATE NOWAIT
,以获得对记录的锁定,然后在同一事务中执行更新。SELECT FOR UPDATE
语句必须使用与UPDATE
相同的WHERE
条件,以锁定要更新的相同记录。如果记录已锁定,则第一个选择更新的
抛出:
ORA-00054:资源繁忙,并在指定NOWAIT或超时过期的情况下获取
SELECT 1 FROM x WHERE id = 625 FOR UPDATE NOWAIT;
update x set x.code = 0 where id = 625 ;
亲爱的krokodilko,谢谢您的回答,但是对于这个问题还有其他解决方案吗?因为在您的解决方案中,我应该更改代码项目中的几个位置,并在更新或删除之前添加“SELECT FOR UPDATE NOWAIT”!如果您想在记录被锁定时抛出异常,那么否-没有其他解决方案SELECT FOR UPDATE NOWAIT
是我所知道的Oracle中唯一能够抛出错误的命令。在这种情况下,所有其他DML命令(更新、删除,有时还插入)等待,直到锁被释放,这是一种标准的SQL行为。例如,我想保护记录不被删除,当此记录在另一个事务中被锁定时。我不希望删除查询等到记录解锁后再删除记录。