Какие строки заблокируются в запросе
select m.id, m.is_ready from machine m join estar e on m.id = e.machine_id where e.status = 'COMP' FOR UPDATE
Интересует блокируется ли строка из таблицы estar и если все таки блокируется как сделать чтобы блокировала только строка из таблицы machine.
Ответ
Для блокировки только записей в одной таблице (или нескольких на выбор, но не всех) можно воспользоваться: select ... for update of tab1.colnam, tab2.colnam
Так будует осуществлена строчная блокировка только таблиц - tab1 и tab2.
Какую колонку из существующих в таблице указывать, не играет абсолютно никакого значения.
Т.к. субзапрос выполняется отдельно от основного, строчки таблиц указанных в нём не будут заблокированы. И наоборот, если субзапрос содержит - for update, а основной нет, строчки из таблиц основного запроса не будут заблокированны.
Пременимо к запросу из вопроса:
select m.id, m.is_ready
from machine m
join estar e e.machine_id = on m.id
where e.status = 'COMP' FOR UPDATE of m.is_ready
;
Наглядный пример использующий оракловую схему SH:
select cu.cust_id, cu.cust_last_name, co.country_name
from customers cu
join countries co on co.country_id=cu.country_id
where cu.cust_id = 69
for update
;
select o.object_name, o.object_type, s.sid, s.serial#, s.status
from v$locked_object l
join v$session s on s.sid = l.session_id
join dba_objects o on o.object_id = l.object_id
;
OBJECT_NAM OBJECT_TYP SID SERIAL# STATUS
---------- ---------- ------ ------- ----------
CUSTOMERS TABLE 22 19511 ACTIVE
COUNTRIES TABLE 22 19511 ACTIVE
2 rows selected.
SQL> rollback;
Rollback complete.
select cu.cust_id, cu.cust_last_name, co.country_name
from customers cu
join countries co on co.country_id=cu.country_id
where cu.cust_id = 69
for update of cu.cust_income_level
;
--*** повторяem выборку текущих блокировок ***
OBJECT_NAM OBJECT_TYP SID SERIAL# STATUS
---------- ---------- ------ ------- ----------
CUSTOMERS TABLE 22 19511 ACTIVE
1 row selected.
Комментариев нет:
Отправить комментарий