Oracle使用SELECT锁定... FOR UPDATE OF

时间:2010-06-18 14:22:56

标签: sql oracle plsql locking

我从桌子FOO和BAR中选择。我想锁定正在返回的FOO记录,但我不希望BAR的记录被锁定。

cursor c_foobar is 
select foo.*, bar.* from
foo, bar
where foo.id = bar.foo_id
for update of <what should I put here?>

似乎我需要指定单个列,但我希望锁定整个foo记录。例如我希望我能做一些像:

cursor c_foobar is
select foo.*, bar.* from
foo, bar
where foo.id = bar.foo_id
for update of foo

我是否必须在for update of部分枚举foo的每一列以便锁定它们?或者我可以随意选择foo中的任何列,即使那些不是它的主键,它会锁定整个记录吗?

1 个答案:

答案 0 :(得分:12)

来自the 10G PL/SQL documentation

  

查询多个表时,可以   使用FOR UPDATE子句来限制   行锁定到特定表。行   在表中只有FOR才会被锁定   UPDATE OF子句指的是一列   在那张桌子里。例如,   以下查询锁定了行中的行   员工表但不在   部门表:

DECLARE
  CURSOR c1 IS SELECT last_name, department_name FROM employees, departments
    WHERE employees.department_id = departments.department_id 
          AND job_id = 'SA_MAN'
      FOR UPDATE OF salary;