5

PL/SQL (Oracle 11g) を使用してEMPLOYEESテーブルの給与列を更新しています。

私は 2 つの別々のスクリプトを使用して同じことを行いました。つまり、従業員の給与を更新しました。

あるスクリプトはFOR UPDATE OFステートメントを使用し、別のスクリプトはそれを使用しません。ROLLBACKどちらの場合も、 orCOMMITコマンドを実行するまでオラクルが行レベルのロックを保持していることがわかりました。

では、2 つのスクリプトの違いは何でしょうか?

どちらを使用するのが良いですか?

私が話している2つのスクリプトは次のとおりです。

-- 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ですか?また、コーディングのより良い方法はどれですか?

4

1 に答える 1

12

を指定すると、データを入力FOR UPDATEした時点で行がロックされSELECTます。がないFOR UPDATE場合、行は行のポイントでロックされますUPDATE。2番目のスクリプトでは、別のセッションが、SELECTが実行されてから試行した時点までの間に行をロックする可能性がありますUPDATE

比較的少数の行とタイトな内部ループを返すステートメントを扱っている場合SELECT、2つの間にかなりの違いがある可能性はほとんどありません。にを追加するFOR UPDATESELECT、更新しようとしている行の1つが他のセッションでロックされている場合にスクリプトを無期限にブロックしたくない場合に、タイムアウト句を追加する機会も得られます。

于 2012-08-10T02:44:57.827 に答える