Страницы

Поиск по вопросам

среда, 20 февраля 2019 г.

Блокировка только одной строки

Какие строки заблокируются в запросе
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.

Комментариев нет:

Отправить комментарий