gpt4 book ai didi

oracle - FOR UPDATE 语句的使用

转载 作者:行者123 更新时间:2023-12-04 17:02:32 26 4
gpt4 key购买 nike

我正在使用 PL/SQL (Oracle 11g) 更新 EMPLOYEES表工资列。

我使用了两个单独的脚本来做同样的事情,即更新员工的工资。

一个脚本使用 FOR UPDATE OF声明其中另一个脚本不使用它。在这两种情况下,我发现 oracle 持有行级锁,直到我们执行 ROLLBACKCOMMIT命令。

那么两个脚本之间有什么区别呢?

哪个更好用?

这是我正在谈论的两个脚本:

-- Script 1: Uses FOR UPDATE OF

declare
cursor cur_emp
is
select employee_id,department_id from employees where department_id = 90 for update of salary;
begin
for rec in cur_emp
loop
update Employees
set salary = salary*10
where current of cur_emp;
end loop;
end;


--Script 2: Does the same thing like script 1 but FOR UPDATE OF is not used here

declare
cursor cur_emp
is
select employee_id,department_id from employees where department_id = 90;
begin
for rec in cur_emp
loop
update Employees
set salary = salary*10
where Employee_ID = rec.employee_id;
end loop;
end;

我发现 Oracle 在这两种情况下都获得了行级锁。那么,使用 FOR UPDATE OF 有什么好处?哪种编码方式更好?

最佳答案

当您指定 FOR UPDATE 时,该行在您 SELECT 处被锁定数据。没有 FOR UPDATE ,该行在您 UPDATE 处被锁定行。在第二个脚本中,另一个 session 可能会锁定 SELECT 之间的行。已被执行,并且您尝试执行的点 UPDATE它。

如果您正在处理 SELECT语句返回相对较少的行和紧密的内部循环,两者之间不太可能存在明显差异。添加 FOR UPDATESELECT如果其他 session 碰巧锁定了您要更新的行之一,如果您不希望脚本无限期阻塞,还可以添加超时子句。

关于oracle - FOR UPDATE 语句的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11894670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com