Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
seesion中的oracle行级锁定不会向其他会话引发错误_Oracle_Concurrency_Locking - Fatal编程技术网

seesion中的oracle行级锁定不会向其他会话引发错误

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条件,以锁定要更新的相同记录。 如

我在第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
条件,以锁定要更新的相同记录。

如果记录已锁定,则第一个选择更新的
抛出:
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行为。例如,我想保护记录不被删除,当此记录在另一个事务中被锁定时。我不希望删除查询等到记录解锁后再删除记录。