Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / почему селект лочит таблицу в lmode 1? / 12 сообщений из 12, страница 1 из 1
07.11.2016, 19:13
    #39342903
niv76
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
Всем привет.

Oracle 11.2.0.4.
После партиционирования таблички с колонкой nested table. Один запрос начал открывать транзакцию и лочить таблицу в LMODE=1.

Воспроизвести промлему можно так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE OR REPLACE TYPE TT_NUMBER      AS TABLE OF NUMBER;

create table trader_acc_ino (
account_id   number,
wl_partner_id number,
status_id     number,
LAYOUT_TYPE_LIST tt_number
)
nested table LAYOUT_TYPE_LIST store as TRDR_ACCNT_NT_LTL1
 STORAGE ( INITIAL 64k )
partition by list (status_id)
subpartition by range (wl_partner_id)
subpartition template (   SUBPARTITION  TA_WLP_346                       values less than (347), 
    SUBPARTITION  TA_WLP_LS_973                    values less than (973),
    SUBPARTITION  TA_WLP_LS_975                    values less than (975),
    SUBPARTITION  TA_WLP_LS_976                    values less than (976),
    SUBPARTITION  TA_WLP_LS_977                    values less than (977),
    SUBPARTITION  TA_WLP_MAX                       values less than (MAXVALUE)
    ) 
(  partition ACT values (0, 1, 2, 3),
   partition INACT values (4)
 )
 enable row movement
...
Рейтинг: 0 / 0
07.11.2016, 19:17
    #39342905
niv76
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
Запрос который создает блокировку :

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare
   p_cur  sys_refcursor;
begin
   rollback;
   open p_cur for
   select 
          (  SELECT 1 FROM trader_acc_ino WHERE ta.account_id = account_id AND ROWNUM <= 1)  as a3
    FROM    trader_acc_ino ta
    LEFT JOIN test_cust.trader_acc_ino acr ON ta.account_id = acr.account_id
    ;

   close p_cur ;
--  commit;
end; 



блокировку можно увидеть здесь:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT l.sid, lo.oracle_username, lo.locked_mode, l.ctime, o.object_id,
       o.owner, o.object_name, o.object_type
  FROM v$lock l, v$locked_object lo, dba_objects o
 WHERE     l.TYPE = 'TM'
       AND l.sid = lo.session_id
       AND l.id1 = lo.object_id
       AND lo.object_id = o.object_id
       AND o.temporary != 'Y'



Может кто-то объяснить, что это за блокировка? Почему стартует транзакция? (после запуска в plsql-developere зажигаются кнопочка, которая говорит что есть не закомиченные данные). И как можно избежать этой блокировки?

Спасибо.
...
Рейтинг: 0 / 0
07.11.2016, 19:24
    #39342906
ora601
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
niv76 Почему стартует транзакция?


Скорее всего из за открытия рефкурсора.

lmode1 = NULL

Код: plsql
1.
2.
    1   Null lock (NL)             Used during some parallel DML operations (e.g. update) by
                                   the pX slaves while the QC is holding an exclusive lock.
...
Рейтинг: 0 / 0
07.11.2016, 19:27
    #39342910
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
Код: plsql
1.
2.
3.
4.
   select 
          (  SELECT 1 FROM trader_acc_ino WHERE ta.account_id = account_id AND ROWNUM <= 1)  as a3
    FROM    trader_acc_ino ta
    LEFT JOIN test_cust.trader_acc_ino acr ON ta.account_id = acr.account_id


это одна таблица/бд или разные
...
Рейтинг: 0 / 0
07.11.2016, 19:38
    #39342914
niv76
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
одна таблица. схему забыл убрать....
...
Рейтинг: 0 / 0
07.11.2016, 19:44
    #39342917
niv76
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
ora601,

спасибо. Запрос можно выполнить и без рефкурсора, результат такой же.
Замечу, что если создать таблицу без партиционирования, то блокировка не создается.

Сам запрос должен содержать внешнее соединение + скалярный подзапрос к любой таблице, не обязательно этой.
Если хоть одно из этих условий убрать, то блокировки не происходит.....
...
Рейтинг: 0 / 0
07.11.2016, 19:46
    #39342918
ora601
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
niv76ora601,

спасибо. Запрос можно выполнить и без рефкурсора, результат такой же.
Замечу, что если создать таблицу без партиционирования, то блокировка не создается.

Сам запрос должен содержать внешнее соединение + скалярный подзапрос к любой таблице, не обязательно этой.
Если хоть одно из этих условий убрать, то блокировки не происходит.....

Тогда остаеться параллель. Как с этим?
...
Рейтинг: 0 / 0
07.11.2016, 20:01
    #39342928
niv76
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
ora601,

Паралеля нет. Поигрался еще немного. Похоже что это вообще не блокировка:
В одной сессии открыл курсор, в другой проверил, что блокировка в v$lock таблице появилась,
и попробовал дропнуть эту таблицу. Дроп прошел!!!

ну и на рабочей базе, ожиданий реально не было, хотя таблица абдейтиться регулярно, а локи эти висят довольно долго, до 300 секунд, пока сессия не закроется...
...
Рейтинг: 0 / 0
07.11.2016, 20:02
    #39342929
ora601
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
niv76ora601,

Паралеля нет. Поигрался еще немного. Похоже что это вообще не блокировка:
В одной сессии открыл курсор, в другой проверил, что блокировка в v$lock таблице появилась,
и попробовал дропнуть эту таблицу. Дроп прошел!!!

ну и на рабочей базе, ожиданий реально не было, хотя таблица абдейтиться регулярно, а локи эти висят довольно долго, до 300 секунд, пока сессия не закроется...

Ну это же не X mode, что ты хотел)
...
Рейтинг: 0 / 0
07.11.2016, 20:10
    #39342932
niv76
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
Вобщем не понятна природа этой блокировки, и может ли она создать какие-то проблемы на много пользовательской базе.
Пока таких проблем обнаружено не было.
Но определенная тревога от непонимания присутствует....
...
Рейтинг: 0 / 0
08.11.2016, 10:37
    #39343184
хм..хм..
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
niv76,

я бы вам посоветовал избавиться от вложенной таблицы,
так вы автоматически избавитесь от возникновения транзакции, а так же от головной боли в будущем в виде сопровождения данной таблицы.
...
Рейтинг: 0 / 0
08.11.2016, 16:01
    #39343617
niv76
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
почему селект лочит таблицу в lmode 1?
была такая мысль, но код старый и много зависимостей. Пока реальных проблем нет, решили понаблюдать....
Спасибо.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / почему селект лочит таблицу в lmode 1? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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