2014-09-26 1 views
2

Рассмотрим эту БД таблицу структуру:Записывается ли родительская таблица, когда операция DDL происходит на дочерней таблице?

table1 {col1, col2, COL3}

таблица2 {col5, col2, col6}

Стлб2 является ПК из таблица1 и является внешним ключом в table2 - ограничение ссылочной целостности существует в таблице2 на col2. но col2 НЕ индексируется в таблице2.

Теперь я выдаю операцию DDL, чтобы удалить столбец col6 из таблицы2.

Выпуск: другие приложения, обращающиеся table1 умер, так как они были не в состоянии Вставьте в table1, потому что замок был приобретен на этом столе.

Вопрос: Выполняет ли DDL-операцию на таблице2 только ограничение внешнего ключа приобретать эксклюзивную блокировку на таблице1?

Я не могу найти никакой информации в Интернете, связанной с этой проблемой. Любая помощь приветствуется.

+0

логически, да, это должно быть. – Rahul

+0

Он может блокироваться, поскольку столбцы отбрасывания приводят к физическому обновлению данных в блоках. Во всяком случае, это лучше, чтобы проверить: ВЫБРАТЬ a.sid , a.serial # , a.username , c.os_user_name , a.program , a.logon_time , a.machine , a.terminal , b.object_id , зиЬзЬг (b.object_name, 1,40) oBJECT_NAME , DECODE (c.locked_mode, 1, 'Нет Lock', 2, 'Row Share', 3, 'Row Exclusive', 4 , 'Общая таблица', 5, 'Эксклюзивная эксклюзивная строка', 6, 'Эксклюзив') locked_mode от v $ session a , db a_objects b , v $ locked_object c где a.sid = c.session_id и b.object_id = c.object_id; – Rusty

ответ

0

В соответствии с docs Только отдельные объекты схемы, которые изменены или привязаны, заблокированы во время операций DDL.

Есть часто странные случаи, связанные с DDL, но в этом случае не возникает никаких проблем с блокировкой. Например, петли ниже могут работать одновременно, не вызывая ошибок. Если вы можете воспроизвести свою ошибку с помощью тестового примера, аналогичного приведенному ниже, мы сможем найти проблему.

Пример схемы

drop table table2; 
drop table table1; 

create table table1(col1 number, col2 number primary key, col3 number); 
create table table2(col5 number, col2 number, col6 number, 
    constraint table2_fk foreign key (col2) references table1(col2)); 

insert into table1 values(1,1,1); 
insert into table1 values(2,2,2); 
insert into table2 values(1,1,1); 
commit; 

Сессия 1 - Изменение родителя, без исключений

begin 
    loop 
     delete from table1 where col2 = 2; 
     insert into table1 values(3,3,3); 
     rollback; 
    end loop; 
end; 
/

Сессия 2 - Изменение ребенка - исключений, как ожидается, и игнорируются

begin 
    loop 
     execute immediate 'alter table table2 drop column col6'; 
     execute immediate 'alter table table2 add (col6 number)'; 
    end loop; 
end; 
/
Смежные вопросы