Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 select for update и deadlock  [new]
Valergrad
Member

Откуда:
Сообщений: 704
create table t ( x number, y varchar2(2000) );

insert into t
select level x, ltrim('a',2000)  from dual
connect by level <= 1000000;

commit;


Теперь в двух сессиях запускаю практически одновременно:
select * from t for update
order by x;


и

select * from t for update
order by x desc;


Казалось бы - я должен получить дедлок. Ведь они будут блочить строки одна сначала, другая с конца.
Но эксперимент показывает, что никакого дедлока нет, одна захватывает все строки, вторая смирно ждет.
То же самое происходит, если это оформить в виде курсора.
В чем же дело? В какой-то табличной блокировке? Не нашел.
18 окт 12, 16:25    [13341722]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
Valergrad
Казалось бы - я должен получить дедлок
Откуда тут дедлок?
18 окт 12, 16:27    [13341734]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
Valergrad
Member

Откуда:
Сообщений: 704
Я себе представляю так.
select for update вызывает row-X(SX) блокировку фетченных строк.
Первая сессия последовательно блочит строки с записями 1,2,3 и т.д.
Вторая сессия последовательно блочит строки с записями 100000, 99999 и т.д

Где-нибудь на 500000 они встретятся, и первая сессия будет ждать освобождения строки 500001, скажем, вторая - скажем строки 500000. И они обе зависнут.

Я вижу что происходит все совсем не так, просьба в том и состоит чтобы указать мне на ошибку в рассуждениях.
18 окт 12, 16:35    [13341797]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
Valergrad
Первая сессия последовательно блочит строки с записями 1,2,3 и т.д.
Вторая сессия последовательно блочит строки с записями 100000, 99999 и т.д
18 окт 12, 16:39    [13341823]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
Valergrad
Member

Откуда:
Сообщений: 704
ORA_SQL, плиз не выдавайте информацию в час по чайной ложке.

Что неправильно?

Что сессия не лочит? Если да, то почему?
Или она делает это не в том порядке? Тогда в каком?
18 окт 12, 16:43    [13341872]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
Valergrad
Member

Откуда:
Сообщений: 704
Проверил на 10.2 и 11.1 - deadlock, как я и предполагал.

Т.е. это особенность именно 11.2
18 окт 12, 18:05    [13342580]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
jhgjhhj
Guest
а планы запросов показать?
18 окт 12, 18:07    [13342595]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Valergrad,

ага, я замечал что в 11.2 появился buffer sort в планах, видимо он и влияет
18 окт 12, 18:10    [13342612]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
Valergrad
Member

Откуда:
Сообщений: 704
xtender, но в плане почему-то buffer sort нет...
18 окт 12, 18:17    [13342634]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
Valergrad
Member

Откуда:
Сообщений: 704
А, ну вот же, на metalink-е есть такой баг

Bug 13371104 - DML lock order for "SELECT .. ORDER BY .. FOR UPDATE

Будет исправлено в 11.2.0.4.
18 окт 12, 18:22    [13342647]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
Valergrad
Member

Откуда:
Сообщений: 704
Так что тему можно закрывать.
18 окт 12, 18:23    [13342650]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
stax..
Guest
Valergrad
Проверил на 10.2 и 11.1 - deadlock, как я и предполагал.

Т.е. это особенность именно 11.2

чесно говоря, для меня поведение в 11 подозрительно непонятно

зы
мож ораклята научились блокировать очень быстро и мы не успеваем нарватся на дедлок


......
stax
18 окт 12, 18:32    [13342687]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
-2-
Member

Откуда:
Сообщений: 15330
stax..
мож ораклята научились
брать миниоткаты даже не селектах.
18 окт 12, 18:56    [13342798]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
stax..
Guest
-2-
stax..
мож ораклята научились
брать миниоткаты даже не селектах.

миниоткаты есть (были) и для select for update
он может вообще вернуть не заблокированные записи, и наоборот выставить блокировку на записи вне результируещей выборки


зы
подозреваю что миниоткатов нет для skip locked, но там другая песня

.....
stax
18 окт 12, 19:12    [13342862]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Valergrad
xtender, но в плане почему-то buffer sort нет...
а optimizer_features_enable какой стоит?
18 окт 12, 20:07    [13343061]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
stax..
он может вообще вернуть не заблокированные записи...
а можно пример или ссылку? я что-то не читал про такое и представить не могу как такое может получится если фетч у него идет после лока
18 окт 12, 22:46    [13343605]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
Никотин2
Guest
Не детерминированная функция во where, на доке и фетче разные значения.
18 окт 12, 22:50    [13343619]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Никотин2
Не детерминированная функция во where, на доке и фетче разные значения.
об этом я не подумал, но я так понимаю, что это актуально только для <11.2. А вообще я за операторы!
18 окт 12, 22:54    [13343630]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
Valergrad
Member

Откуда:
Сообщений: 704
А да, напишу, может кому полезно будет.
Пока не выйдет 11.2.0.4 дедлоков избегать и обеспечивать порядок будем хинтами index_asc, а что делать...
19 окт 12, 13:16    [13346353]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
stax..
Guest
xtender
Valergrad,

ага, я замечал что в 11.2 появился buffer sort в планах, видимо он и влияет

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
у меня етот загадочный buffer sort появляется почти всегда (даже без order by)
причем когда в плане будет SORT ORDER BY, а когда BUFFER SORT я пока понять не могу

зы
не задавался вопросом получить дедлок в случае for update order by,
просто веріл что блокирует в порядке сортировки,
даже с хинтом и с order by пока не получилось
(правда я пробовал на 10 записях и с задержкой sleep,
подозреваю что на больших обьемах всетаки вылезет дедлок)


.....
stax
19 окт 12, 16:35    [13347942]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
stax..
xtender
Valergrad,
ага, я замечал что в 11.2 появился buffer sort в планах, видимо он и влияет

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
у меня етот загадочный buffer sort появляется почти всегда (даже без order by)
причем когда в плане будет SORT ORDER BY, а когда BUFFER SORT я пока понять не могу
зы
не задавался вопросом получить дедлок в случае for update order by,
просто веріл что блокирует в порядке сортировки,
даже с хинтом и с order by пока не получилось
(правда я пробовал на 10 записях и с задержкой sleep,
подозреваю что на больших обьемах всетаки вылезет дедлок)
.....
stax
Хватит бредить
Помедитируйте над:
create table t_1000
as 
select level l from dual connect by level <=1000

-- Session 1

declare
cursor c is
select l from t_1000 order by l asc for update;
begin
open c;
dbms_lock.sleep(10);
close c;
end;

-- Session 2
declare
cursor c is
select l from t_1000 order by l desc for update;
begin
open c;
close c;
end;
19 окт 12, 17:00    [13348089]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
ORA__SQL
Хватит бредить
действительно, прекращайте уже... создайте функцию sleep'a и внесите в where а потом пробуйте.
19 окт 12, 17:13    [13348137]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
stax..
Guest
ORA__SQL
stax..
пропущено...

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
у меня етот загадочный buffer sort появляется почти всегда (даже без order by)
причем когда в плане будет SORT ORDER BY, а когда BUFFER SORT я пока понять не могу
зы
не задавался вопросом получить дедлок в случае for update order by,
просто веріл что блокирует в порядке сортировки,
даже с хинтом и с order by пока не получилось
(правда я пробовал на 10 записях и с задержкой sleep,
подозреваю что на больших обьемах всетаки вылезет дедлок)
.....
stax
Хватит бредить
Помедитируйте над:
create table t_1000
as 
select level l from dual connect by level <=1000

-- Session 1

declare
cursor c is
select l from t_1000 order by l asc for update;
begin
open c;
dbms_lock.sleep(10);
close c;
end;

-- Session 2
declare
cursor c is
select l from t_1000 order by l desc for update;
begin
open c;
close c;
end;

Что Вы хотели етим сказать?
Первая
16:05:25 SQL> /

Table created.

16:05:28 SQL> declare
16:05:35   2  cursor c is
16:05:35   3  select l from t_1000 order by l asc for update;
16:05:35   4  begin
16:05:35   5  open c;
16:05:35   6  dbms_lock.sleep(10);
16:05:35   7  close c;
16:05:35   8  end;
16:05:35   9
16:05:35  10  .
16:05:37 SQL>
16:06:24 SQL> /

PL/SQL procedure successfully completed.

16:06:55 SQL> commit;

Commit complete.

16:06:59 SQL>


Вторая
16:05:52 SQL> ed
Wrote file afiedt.buf

  1  declare
  2  cursor c is
  3  select l from t_1000 order by l desc for update;
  4  begin
  5  open c;
  6  close c;
  7* end;
16:06:12 SQL>
16:06:28 SQL>
16:06:28 SQL> /

PL/SQL procedure successfully completed.

16:06:59 SQL>
16:07:05 SQL>
16:07:05 SQL>


вторая ждала коммита, задача получить деадлок

......
stax
19 окт 12, 17:13    [13348138]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
stax..
Guest
xtender
ORA__SQL
Хватит бредить
действительно, прекращайте уже... создайте функцию sleep'a и внесите в where а потом пробуйте.

я пробовал с ф-цией и во where и в ордер бу на 10-ти записях пока не получилось

такое впечатления что блокирует очень быстро и я не успеваю вклинится (сихронизировать) в момент наложения лока

.....
stax
19 окт 12, 18:16    [13348414]     Ответить | Цитировать Сообщить модератору
 Re: select for update и deadlock  [new]
прам-пам-памммммм
Guest
в первом посте есть тесткейс - запустите его на НЕ11.2 и вопросы отпадут.
а кейс с 1000 строк - это халтура:)
19 окт 12, 18:18    [13348417]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить