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的主要内容,如果未能解决你的问题,请参考以下文章
ORACLE PL/SQL:在 Oracle SQL Developer 中测试 SELECT FOR UPDATE
Oracle 数据库 SELECT... FOR UPDATE 与自动提交