在 Oracle SQL 更新语句中,假设更新会影响 5 行,更新语句是同时更新所有 5 行还是顺序更新所有 5 行?例如
UPDATE table1
set column2 = 'completed' WHERE
index between 1 AND 5
在上面的语句中,索引 1 到 5 会按顺序更新,即 1、2、3、4 然后 5,或者它会同时发生(1-5 一次全部)。
我提到了 Oracle documentation但似乎没有提到这一点。
最佳答案
UPDATE 语句执行后,该语句的效果将对事务的其余部分可见(如果您提交,则对其他事务可见)。 Oracle 将以什么顺序实际执行它,是一个实现细节(同样不能保证 SELECT 结果的顺序,除非您指定 ORDER BY)。
在大多数情况下,这个顺序对客户来说并不重要。一种可能的情况是避免与正在更新重叠行集的另一个事务发生死锁。 UPDATE 将锁定正在更新的行,直到事务结束,因此如果两个事务试图锁定相同的行,但顺序不同,则可能会发生死锁。
避免死锁的标准方法是始终按明确定义的顺序进行锁定。不幸的是,UPDATE 没有 ORDER BY 子句,但您可以这样做:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT ... WHERE condition ORDER BY ... FOR UPDATE;
UPDATE ... WHERE condition;
COMMIT;
两个语句的 condition
相同。可序列化隔离级别对于 WHERE
始终在两个语句中看到相同的行集是必需的。
或者,在 PL/SQL 中你可以这样做:
DECLARE
CURSOR CUR IS SELECT * FROM YOUR_TABLE WHERE condition ORDER BY ... FOR UPDATE;
BEGIN
FOR LOCKED_ROW IN CUR LOOP
UPDATE YOUR_TABLE SET ... WHERE CURRENT OF CUR;
END LOOP;
END;
/
关于database - Oracle SQL更新语句中,行更新是否并发发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9552739/