powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Lock child table- Почему?
21 сообщений из 21, страница 1 из 1
Lock child table- Почему?
    #39458521
Незнайка_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Объяснял новому сотруднику основы изоляции данных(предложил прочитать Oracle Database Concepts)и столкнулся разночтением практики и теории: в разделе Locks and Foreign Keys
говорится, что the database acquires a full table lock on employees during the primary key modification of department 60. This lock enables other sessions to query but not update the employees table.
На деле такого не происходит, так как сразу срабатывает constraint и не дает в родительской изменять РК:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
drop table t1;
create table t1 (id integer primary key, idname varchar2(20));

drop table t_child ;
create table t_child (id integer, id_pr integer not null,
   idname varchar2(20)
   ,CONSTRAINT parent_id_fk
   foreign key(id_pr) references t1(id)   
   );
insert into t1(id,idname) values(100, 'test1');
insert into t1(id,idname) values(200, 'test2');
commit;

insert into t_child values(1,100, 'test_'||sysdate);
insert into t_child values(2,100, 'test_'||sysdate);
insert into t_child values(3,200, 'test_'||sysdate);
insert into t_child values(4,200, 'test_'||sysdate);
commit;

update t1 set id=101 where id=100;
--ORA-02292: integrity constraint (PARENT_ID_FK) violated - child record found


Причем, соответственно, ни в gv$locked_object, ни в dba_lock блокировок объектов/сессий нет.
Собственно, хочется понять что хотели сказать в мане)
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458536
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Незнайка_блокировок объектов/сессий нет.Табличная блокировка накладывается только на время проверки. Более того у тебя всё равно statement level rollback.
Чтобы прослезиться:
в первой сессии одному папе делаешь дитя;

во второй сессии пытаешься убить другого папу;

ну в третей пытаешься сделать дитя третьему папе.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458553
Незнайка_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Табличная блокировка накладывается только на время проверки.
Elic, получается, подтвердить это возможно тока трейсом сессии?!
Смущает, что в данном мане не сделали оговорку(Ноту) на констрейнты.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458555
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Незнайка_получается, подтвердить это возможно тока трейсом сессии?!И что ты там надеешься узреть?
Воспроизведи описанный мной сценарий - и увидишь.
Незнайка_Смущает, что в данном мане не сделали оговорку(Ноту) на констрейнты.Ты подслеповат? Непосредственно там же:Locking Mechanisms with Unindexed Foreign KeyThe table lock on employees releases immediately after the primary key modification on the departments table completes.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458560
Незнайка_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicНезнайка_Смущает, что в данном мане не сделали оговорку(Ноту) на констрейнты.Ты подслеповат? Непосредственно там же:Locking Mechanisms with Unindexed Foreign KeyThe table lock on employees releases immediately after the primary key modification on the departments table completes.
Elic ...я имел ввиду constraint, о чем ты говоришь - это все же касаемо lock и его снятия.
Как я показал в примере- до лока дело не доходит(на первый взгляд)) - срабатывает constraint.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458577
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Незнайка_Как я показал в примере- до лока дело не доходит(на первый взгляд)) - срабатывает constraint.Это лишь твоё некомпетентное мнение.
Чтобы убедиться, стань четвертой сессией.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458734
Незнайка_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicВоспроизведи описанный мной сценарий - и увидишь.
Воспроизвел- результат "интересный":
Код: plsql
1.
2.
3.
4.
5.
insert into t_child values(5,100, 'test_'||sysdate);

select do.OBJECT_NAME,l.LOCKED_MODE
from gv$locked_object l, dba_objects do 
where  do.OBJECT_ID=l.OBJECT_ID;


OBJECT_NAME LOCKED_MODET1 3T_CHILD 3
Хотя:
Oracle Database ConceptsDML on a child table does not acquire a table lock on the parent table.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458781
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Незнайка_Воспроизвел- результат "интересный":Ты сделал что-то не то, потом куда-то не туда не так посмотрел.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458802
Незнайка_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicНезнайка_Воспроизвел- результат "интересный":Ты сделал что-то не то, потом куда-то не туда не так посмотрел.
Выполнил ещё раз на "изолированной" БД- результат подтвердился. Если есть возможность, воспроизведи, код взят без изменений из поста.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458808
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Незнайка_основы изоляции данныхА что это?
Незнайка_Причем, соответственно, ни в gv$locked_object, ни в dba_lock блокировок объектов/сессий нет.Блокировка накладывается только на время проверки, а на древних версиях накладывалась до окончания транзакции.
Поведение было изменено вроде в девятке.

Про это есть в книге Кайта в разделе про "неиндексированные внешние ключи".
Там вообще неплохая книга, почитайте перед тем как учить других.

Если интересует копнуть глубже - event 10704.

Вот посмотри как умный человек смотрит что происходит: Foreign Keys and Library Cache Locks .
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458819
Незнайка_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop Про это есть в книге Кайта в разделе про "неиндексированные внешние ключи".
Там вообще неплохая книга, почитайте перед тем как учить других.
Читал, предпочитаю первоисточник. Я ни кого не учу, делюсь полученным результатом, разбираюсь в чем я заблуждаюсь, для этого привожу исполняемый код.
За ссылку спасибо.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458848
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поведение менялось несколько раз
TM-блокировка накладывается в RX режиме (и держится, препятствуя изменению структуры), но на сам момент проверки пытается захватить в режиме SRX (или S?)
В 9-ке, насколько помню, блокировочка была RS
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458859
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Незнайка_dbms_photoshop Про это есть в книге Кайта в разделе про "неиндексированные внешние ключи".
Там вообще неплохая книга, почитайте перед тем как учить других.
Читал, предпочитаю первоисточник. Я ни кого не учу, делюсь полученным результатом, разбираюсь в чем я заблуждаюсь, для этого привожу исполняемый код.
За ссылку спасибо.Я бы рекомендовал последовательность.
1. Первоисточник.
2. Книга Кайта, блог Льюиса для расширения кругозора.
3. Первоисточники для деталей, если интересно.

Например если ввести в гугл "jonathan lewis oracle locking", то можно найти много интересного.

PS. "Объяснял новому сотруднику" = "Я ни кого не учу"? Ок.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458864
Незнайка_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав ЛюбомудровПоведение менялось несколько раз
TM-блокировка накладывается в RX режиме (и держится, препятствуя изменению структуры), но на сам момент проверки пытается захватить в режиме SRX (или S?)
В 9-ке, насколько помню, блокировочка была RS
Из представления v$locked_object видно, что блокировка SX, интересно почему она есть и на parent table.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458870
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458886
Незнайка_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров https://docs.oracle.com/cd/E11882_01/server.112/e40540/consist.htm#BABDDFHB
Вячеслав, ещё раз прочитал, не понял, что хотели донести.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39458890
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что SX это и есть RX

Как поймать, какая блокировка будет на момент проверки, надеюсь, не надо объяснять?
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39459247
Незнайка_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав ЛюбомудровЧто SX это и есть RX

Как поймать, какая блокировка будет на момент проверки, надеюсь, не надо объяснять?
Вячеслав,
авторTherefore, SX locks allow multiple transactions to obtain simultaneous SX and subshare table locks for the same table.
Что не так я понял?
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39459262
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю, что ты неправильно понял

Изменение (INSERT/UPDATE/DELETE) дочерней или родительской таблицы накладывает RX (другое название SX) блокировку на обе таблицы, чтобы предотвратить изменение структуры обеих таблиц.

При модификации родительской таблицы (UPDATE/DELETE) при неиндексированном внешнем ключе на время операции пытается еще дополнительно получить S (shared) блокировку на дочерней таблице. Что вызовет ожидание, если кто-то уже изменил родительскую или дочернюю таблицу (повесил RX блокировку на дочернюю таблицу)
При вставках в родительскую или при индексированном ключе на дочернюю таблицу вешается только RX, что совместимо с обновлениями, сделанными в других сессиях.

Это поведение сейчас в 11g, оно несколько раз менялось в деталях и не всегда точно отражалось в документации.

В 10g (и раньше, непомню точно, возможно во всех предыдущих версиях) при изменении дочерней на родительскую таблицу накладывалась менее ограничивающая блокировка RS (SS), что так же предохраняла от изменения структуры, но позволяла, например создать еще один внешний ключ на эту же родительскую таблицу (Share совместима с Row Share, а вот с Row eXclusive уже нет).
С 11g при изменении в какой-либо дочерней таблице нельзя поднять еще один внешний ключ на эту же родительскую таблицу

С секционированными таблицами там еще блокировки вешаются на секции и там уже SRX появляются, если склероз не изменяет
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39459647
Незнайка_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав ЛюбомудровНе знаю, что ты неправильно понял

Изменение (INSERT/UPDATE/DELETE) дочерней или родительской таблицы накладывает RX (другое название SX) блокировку на обе таблицы, чтобы предотвратить изменение структуры обеих таблиц.

Вячеслав, о чем вы говорите, это понятно из опыта(все равно спасибо, за детализацию), меня смутило, что я не нашел документального явного объяснения этого в мане...Oracle Database Concepts.
...
Рейтинг: 0 / 0
Lock child table- Почему?
    #39459759
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, у них в документации сделана попытка упростить термины
Типо TM-блокировки Row Share / Row eXclusive -- RS/RX (SS/SX) не считаются FULL TABLE LOCK, в отличии от S / SRX (SSX) / X

Хужее, что подобная тенденция и на MOS:
Текущая "Foreign Keys, Indexes and Locking (Doc ID 1945574.1)" тоже отсылает в доку и стыдливо умалчивает о Row TM блокировках
И только отсылка оттуда же к древней "Documentation Correction to 9.2.0 Foreign Key Constraint Locking Behaviour (Doc ID 223303.1)" немного проясняет:...no table locks of any kind are acquired...

There are errors in this information.

Starting in version 9.2.0, a Row-SS lock is taken on the parent table for any DML issued against the child table... Further, there will be a ROW-SS lock taken on the child table for any INSERT/DELETE/UPDATE issued against the parent table when an index on the foreign key column of the child table is defined. There will be a ROW-SX lock taken on the child table for an DELETE issued against the parent table when no index on the foreign key column of the child table is defined and a delete cascade constraint is defined.
...
This change in behaviour was introduced in version 9.2.0
...
This new locking behaviour is an expected behaviour for the Oracle code. As only shared locks are involved, it does not prevent DML from being issued against either the child or parent tables. It will prevent operations that require an exclusive table level lock.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Lock child table- Почему?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]