Oracle 锁定与 SELECT...FOR UPDATE OF

Posted

技术标签:

【中文标题】Oracle 锁定与 SELECT...FOR UPDATE OF【英文标题】:Oracle locking with 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 中的任何列,即使是那些不是它的主键的列,它会锁定整个记录?

【问题讨论】:

【参考方案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

以上是关于Oracle 锁定与 SELECT...FOR UPDATE OF的主要内容,如果未能解决你的问题,请参考以下文章

select for update行锁

ORACLE PL/SQL:在 Oracle SQL Developer 中测试 SELECT FOR UPDATE

Oracle 数据库 SELECT... FOR UPDATE 与自动提交

Postgres SELECT ... FOR UPDATE 函数

SELECT FOR UPDATE 用于锁定查询

mysql select for update:未锁定以供读取