Блокировка Oracle с помощью SELECT ... ДЛЯ ОБНОВЛЕНИЯ - PullRequest
8 голосов
/ 18 июня 2010

Я выбираю из таблиц 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

Нужно ли перечислять каждый столбец foo в разделе for update of, чтобы заблокировать их все? Или я могу произвольно выбрать любой столбец в foo, даже тот, который не является его первичным ключом, и он заблокирует всю запись?

1 Ответ

12 голосов
/ 18 июня 2010

С документация PL / SQL 10G :

При запросе нескольких таблиц вы можете используйте предложение FOR UPDATE, чтобы ограничить блокировка строк в определенных таблицах. Ряды в таблице заблокированы только если ЗА Предложение 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;
...