powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Блокировка таблицы фактов при вставке строки в справочник
6 сообщений из 6, страница 1 из 1
Блокировка таблицы фактов при вставке строки в справочник
    #39559011
pihel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу понять логику работы oracle, подскажите.
Есть таблица 1, которая ссылается на таблицу 2 через FK. Я вставляю данные в таблицу 2 и пока не закомичу эти данные, не могу сделать очистку таблицы 1:

Тест кейс:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
drop table tst1;
drop table tst2;

create table tst1 as
select level as id, level+1 as id2,  mod(level,10) as fid, lpad('*', level, '*') as pad from dual connect by level <= 100;

create table tst2 as
select level as id, lpad('*', level, '*') as name from dual connect by level <= 10;


ALTER TABLE tst1 ADD CONSTRAINT pk_tst1 PRIMARY KEY (id) USING INDEX;
ALTER TABLE tst2 ADD CONSTRAINT pk_tst2 PRIMARY KEY (id) USING INDEX;

alter table tst1 add
CONSTRAINT tstfk FOREIGN KEY (fid)
                  REFERENCES tst2 (id) ON DELETE CASCADE ENABLE NOVALIDATE;
                  
create index tst1_fk on tst1(fid);



сессия 1:
Код: plsql
1.
2.
insert into tst2 select -1 as id, ' ' as pad from dual;
1 row inserted.


сессия 2:
Код: plsql
1.
2.
3.
truncate table tst1;
ORA-00054: ресурс занят и задано его получение с параметром NOWAIT, либо истекло время ожидания
00054. 00000 -  "resource busy and acquire with NOWAIT specified or timeout expired"



какой смысл накладывать row share lock на таблицу tst1, если вставка идет в tst2 и FK идет с tst1 на tst2 ?
...
Рейтинг: 0 / 0
Блокировка таблицы фактов при вставке строки в справочник
    #39559018
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обеспечить, чтобы какие-нибудь умники не дропнули/не переименовали табличку с чилдами пока идет некая транзакция на паренте?
...
Рейтинг: 0 / 0
Блокировка таблицы фактов при вставке строки в справочник
    #39559024
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pihelпока не закомичу эти данные, не могу сделать очистку таблицы 1:

Используй delete вместо truncate.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Блокировка таблицы фактов при вставке строки в справочник
    #39615814
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovpihelпока не закомичу эти данные, не могу сделать очистку таблицы 1:

Используй delete вместо truncate.

У меня аналогичная ситуация - ORA-00054 при truncate table и drop table (11.2.0.4).
delete зависает. При этом нижеследующий запрос возвращает пустой набор данных:
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM, S.USERNAME, S.MACHINE, S.PORT,
  S.LOGON_TIME,SQ.SQL_FULLTEXT 
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S, V$PROCESS P, V$SQL SQ 
WHERE L.OBJECT_ID = O.OBJECT_ID
  AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR
  AND S.SQL_ADDRESS = SQ.ADDRESS



также как и
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM, S.USERNAME, S.MACHINE, S.PORT,
  S.LOGON_TIME, SQ.SQL_FULLTEXT 
FROM gV$LOCKED_OBJECT L, DBA_OBJECTS O, gV$SESSION S, gV$PROCESS P, gV$SQL SQ 
WHERE L.OBJECT_ID = O.OBJECT_ID
  AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR
  AND S.SQL_ADDRESS = SQ.ADDRESS



Как можно решить эту проблему?
...
Рейтинг: 0 / 0
Блокировка таблицы фактов при вставке строки в справочник
    #39615850
Фотография Pastic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл:

Код: plsql
1.
2.
3.
4.
select lo.ORACLE_USERNAME, lo.OS_USER_NAME, do.OBJECT_NAME, do.OBJECT_TYPE,
  'Alter system kill session '''||gvs.SID||','||gvs.SERIAL#||''';' x
from gV$LOCKED_OBJECT lo, DBA_OBJECTS do, gV$SESSION gvs
where Lo.OBJECT_ID = dO.OBJECT_ID and Lo.SESSION_ID=gvs.SID
...
Рейтинг: 0 / 0
Блокировка таблицы фактов при вставке строки в справочник
    #39615859
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PasticНашёл:

Код: plsql
1.
2.
3.
4.
select lo.ORACLE_USERNAME, lo.OS_USER_NAME, do.OBJECT_NAME, do.OBJECT_TYPE,
  'Alter system kill session '''||gvs.SID||','||gvs.SERIAL#||''';' x
from gV$LOCKED_OBJECT lo, DBA_OBJECTS do, gV$SESSION gvs
where Lo.OBJECT_ID = dO.OBJECT_ID and Lo.SESSION_ID=gvs.SID


Почти попал
Найди 4 отличия =)
Код: plsql
1.
2.
3.
4.
select lo.ORACLE_USERNAME, lo.OS_USER_NAME, do.OBJECT_NAME, do.OBJECT_TYPE,
  'Alter system disconnect session '''||gvs.SID||','||gvs.SERIAL# || ',@' || gvs.inst_id || ''' immediate;' x
from gV$LOCKED_OBJECT lo, DBA_OBJECTS do, gV$SESSION gvs
where Lo.OBJECT_ID = dO.OBJECT_ID and Lo.SESSION_ID=gvs.SID and lo.INST_ID=gvs.INST_ID
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Блокировка таблицы фактов при вставке строки в справочник
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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