Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Lock child table- Почему? / 21 сообщений из 21, страница 1 из 1
24.05.2017, 07:18
    #39458521
Незнайка_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lock child table- Почему?
Здравствуйте!
Объяснял новому сотруднику основы изоляции данных(предложил прочитать 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
24.05.2017, 08:01
    #39458536
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lock child table- Почему?
Незнайка_блокировок объектов/сессий нет.Табличная блокировка накладывается только на время проверки. Более того у тебя всё равно statement level rollback.
Чтобы прослезиться:
в первой сессии одному папе делаешь дитя;

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

ну в третей пытаешься сделать дитя третьему папе.
...
Рейтинг: 0 / 0
24.05.2017, 08:46
    #39458553
Незнайка_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lock child table- Почему?
Табличная блокировка накладывается только на время проверки.
Elic, получается, подтвердить это возможно тока трейсом сессии?!
Смущает, что в данном мане не сделали оговорку(Ноту) на констрейнты.
...
Рейтинг: 0 / 0
24.05.2017, 08:55
    #39458555
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lock child table- Почему?
Незнайка_получается, подтвердить это возможно тока трейсом сессии?!И что ты там надеешься узреть?
Воспроизведи описанный мной сценарий - и увидишь.
Незнайка_Смущает, что в данном мане не сделали оговорку(Ноту) на констрейнты.Ты подслеповат? Непосредственно там же:Locking Mechanisms with Unindexed Foreign KeyThe table lock on employees releases immediately after the primary key modification on the departments table completes.
...
Рейтинг: 0 / 0
24.05.2017, 09:14
    #39458560
Незнайка_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lock child table- Почему?
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
24.05.2017, 09:33
    #39458577
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lock child table- Почему?
Незнайка_Как я показал в примере- до лока дело не доходит(на первый взгляд)) - срабатывает constraint.Это лишь твоё некомпетентное мнение.
Чтобы убедиться, стань четвертой сессией.
...
Рейтинг: 0 / 0
24.05.2017, 11:58
    #39458734
Незнайка_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lock child table- Почему?
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
24.05.2017, 12:33
    #39458781
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lock child table- Почему?
Незнайка_Воспроизвел- результат "интересный":Ты сделал что-то не то, потом куда-то не туда не так посмотрел.
...
Рейтинг: 0 / 0
24.05.2017, 12:49
    #39458802
Незнайка_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lock child table- Почему?
ElicНезнайка_Воспроизвел- результат "интересный":Ты сделал что-то не то, потом куда-то не туда не так посмотрел.
Выполнил ещё раз на "изолированной" БД- результат подтвердился. Если есть возможность, воспроизведи, код взят без изменений из поста.
...
Рейтинг: 0 / 0
24.05.2017, 12:58
    #39458808
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lock child table- Почему?
Незнайка_основы изоляции данныхА что это?
Незнайка_Причем, соответственно, ни в gv$locked_object, ни в dba_lock блокировок объектов/сессий нет.Блокировка накладывается только на время проверки, а на древних версиях накладывалась до окончания транзакции.
Поведение было изменено вроде в девятке.

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

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

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

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

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

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

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

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

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

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

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

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

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

Вячеслав, о чем вы говорите, это понятно из опыта(все равно спасибо, за детализацию), меня смутило, что я не нашел документального явного объяснения этого в мане...Oracle Database Concepts.
...
Рейтинг: 0 / 0
25.05.2017, 15:23
    #39459759
Вячеслав Любомудров
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Lock child table- Почему?
Я так понимаю, у них в документации сделана попытка упростить термины
Типо 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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Lock child table- Почему? / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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