加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

database – 在Oracle SQL更新语句中,是否同时进行行更新?

发布时间:2020-12-12 13:11:58 所属栏目:百科 来源:网络整理
导读:在Oracle SQL更新语句中,假设更新会影响5行,update语句是否会同时或按顺序更新所有5行?例如. UPDATE table1 set column2 = 'completed' WHEREindex between 1 AND 5 在上面的陈述中,索引1到5将按顺序更新,即1,2,3,4然后5,或者它会同时发生(1-5全部一次). 我
在Oracle SQL更新语句中,假设更新会影响5行,update语句是否会同时或按顺序更新所有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实际执行的顺序是实现细节(类似地,除非指定ORDER BY,否则无法保证SELECT结果的顺序).

在大多数情况下,此订单对客户来说无关紧要.一种情况可能是避免与另一个更新重叠行集的事务发生死锁. UPDATE将锁定正在更新的行,直到事务结束,因此如果两个事务尝试锁定相同的行,但顺序不同,则可能会发生死锁.

避免死锁的标准方法是始终锁定明确定义的顺序.不幸的是,UPDATE没有ORDER BY子句,但你可以这样做:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT ... WHERE condition ORDER BY ...  FOR UPDATE;
UPDATE ... WHERE condition;
COMMIT;

两个陈述的条件相同的情况.可序列化隔离级别对于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;
/

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读