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

8

我正在从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个回答

13

以下内容来自10G PL/SQL文档

在查询多个表时,您可以使用FOR UPDATE子句将行锁定限制在特定的表中。只有当FOR UPDATE OF子句引用该表中的列时,才会锁定表中的行。例如,下面的查询锁定employees表中的行,但不锁定departments表中的行:

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;

非常好;不确定我怎么错过了那个。所以我猜它只需要行中的任意列名...很容易,但对我来说似乎不是特别直观。 - aw crud
我同意,这并不是必须的。我似乎记得很久以前在某个地方读到过,指定列的要求是为了在未来的某个版本中,Oracle可能只锁定行中的特定列。但我的记忆有点模糊。 - Tony Andrews
2
这是一种自我记录的代码形式,我觉得:“我只打算更新列 salary”。 - Jeffrey Kemp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接