Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dbms_lock.release() / 8 сообщений из 8, страница 1 из 1
16.09.2006, 13:50
    #33991861
Cotton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dbms_lock.release()
С помощью dbms_lock.allocate_unique создаю собственный лок. Если он только создан, то dbms_lock.request по даному lockhandle возвращает 0. Если генериться этот же лок с таким же именем, dbms_lock.request возвращает значение 4. Вопрос. Каким образом можна "убить" этот лок? Использую dbms_lock.release, но толку от него нету. В dbms_lock_allocated лок продолжает висеть, а dbms_lock.request возвращает значение 4.

--------
Любовь и боль
Покой и бой
Я как любой
Несу с собой
...
Рейтинг: 0 / 0
16.09.2006, 14:17
    #33991875
Q u a d r o
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dbms_lock.release()
Как насчёт test case - нечто, что мы все можем запустить и убедиться?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
SQL> declare
   2    l_result number;
   3   begin
   4    l_result:=dbms_lock.request(
   5     id =>  1 ,
   6     lockmode => dbms_lock.x_mode,
   7     release_on_commit => false
   8    );
   9    dbms_output.put_line('result: '||to_char(l_result));
  10   end;
  11   /
result:  0 

PL/SQL procedure successfully completed.

--мы владеем блокировкой, поэтому следующий вызов вернёт 4
SQL> declare
   2    l_result number;
   3   begin
   4    l_result:=dbms_lock.request(
   5     id =>  1 ,
   6     lockmode => dbms_lock.x_mode,
   7     release_on_commit => false
   8    );
   9    dbms_output.put_line('result: '||to_char(l_result));
  10   end;
  11   /
result:  4 

PL/SQL procedure successfully completed.

--нам необходимо освободить блокировку
SQL> declare
   2    l_result number;
   3   begin
   4    l_result:=dbms_lock.release(id =>  1 );
   5   end;
   6   /

PL/SQL procedure successfully completed.

--теперь мы получим 0
SQL> declare
   2    l_result number;
   3   begin
   4    l_result:=dbms_lock.request(
   5     id =>  1 ,
   6     lockmode => dbms_lock.x_mode,
   7     release_on_commit => false
   8    );
   9    dbms_output.put_line('result: '||to_char(l_result));
  10   end;
  11   /
result:  0 

PL/SQL procedure successfully completed.

...
Рейтинг: 0 / 0
16.09.2006, 17:18
    #33991970
Cotton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dbms_lock.release()
все верно, но последний код возвращает 4, вместо 0.
В v$lock она продолжает висеть.

--------
Любовь и боль
Покой и бой
Я как любой
Несу с собой
...
Рейтинг: 0 / 0
16.09.2006, 17:38
    #33991981
Q u a d r o
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dbms_lock.release()
Cotton все верно, но последний код возвращает 4, вместо 0.
Покажите cut&paste из вашего SQL*Plus. У меня последний вызов вернул 0 ???
...
Рейтинг: 0 / 0
18.09.2006, 16:34
    #33994617
Cotton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dbms_lock.release()
Попробовал снова - получилось.
Но вопрос остался открытым. Ведь в своем случае я создавал блокировку ч-з dbms_lock.allocate_unique. Я так понимаю, при этом создается запись в таблице dbms_lock_allocated, где указывается имя даного лока. В моем случае это важно (блокировке присваивать уникальное имя). Мне нужно создать лока и после отработки кода удалить его. Но с этим как раз и проблемы...
--------
Любовь и боль
Покой и бой
Я как любой
Несу с собой
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
13.04.2020, 18:47
    #39946715
adar7
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dbms_lock.release()
Cotton,

я разобрался с этой гнилой оракловой темкой.

Если релиз возвращает 4, значит есть сессия, которая не дает снять блокировку.
Тебе мой друг нужно в этом случае прибить её отсюда:

Код: plsql
1.
2.
3.
select *
from DBA_LOCKS
where LOCK_TYPE = 'PL/SQL User Lock';
...
Рейтинг: 0 / 0
13.04.2020, 19:08
    #39946728
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dbms_lock.release()
adar7
я разобрался с этой гнилой оракловой темкой.
Ты сильно преувеливаешь свою результативность.
...
Рейтинг: 0 / 0
14.04.2020, 11:20
    #39946896
elunin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dbms_lock.release()
adar7
Если релиз возвращает 4, значит есть сессия, которая не дает снять блокировку.

Код: plaintext
4- Don't own lock specified by id or lockhandle
вы не владеете этой блокировкой, и соответственно нет возможности ее удалить.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / dbms_lock.release() / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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