【问题标题】:Oracle locking with SELECT...FOR UPDATE OFOracle 锁定与 SELECT...FOR UPDATE OF
【发布时间】:2010-06-18 14:22:56
【问题描述】:

我从 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 中的任何列,即使是那些不是它的主键的列,它会锁定整个记录?

【问题讨论】:

    标签: sql oracle plsql locking


    【解决方案1】:

    来自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;
    

    【讨论】:

    • 很好;不知道我是怎么错过的。所以我想它只需要行中的任意列名......很简单,但对我来说似乎不是很直观。
    • 我同意,事实并非如此。我似乎记得很久以前在某处读到过,指定列的要求是这样的,以便在将来的某个版本中,Oracle 可能只锁定行中的特定列。但我的记忆是模糊的。
    • 这是一种自我记录的代码形式,我认为:“我只打算更新列salary
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2011-06-28
    • 2017-12-05
    • 1970-01-01
    相关资源
    最近更新 更多