database - Oracle SQL更新语句中,行更新是否并发发生?

标签 database oracle concurrency sql-update

在 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/

相关文章:

c++ - 使用 Async/Futures 并行和并发地计算 vector 的范数

java - Java 中的多线程 - 异步行为

MySQL:为什么我的索引长度是 0.0 字节?

database - 在没有主键的情况下查询 Firestore

oracle - 以静默模式安装 Oracle 数据库时如何忽略可选先决条件?

SQL-缺少右括号

haskell - TVar 和 TMVar 之间的区别

database - 使用 Winforms 应用程序部署 SQL Server 数据库

java - 与 Java JDBC 作斗争 :sqlite connection using Intellij

sql - 添加要选择的列 *