Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Oracle concurrency и consistency - недоумение и вопросы  [new]
confused
Guest
SQL> select * from test;

        ID        VAL
---------- ----------
         0         10
         1         20
         2         50
         3        100
         4       1000

SQL> delete from test where val = (select max(val) from test);

0 rows deleted.

SQL>

А все потому что в соседней сессии:
SQL> update test set val = 0  where id = 4;

1 row updated.

SQL> commit;

Commit complete.


Собственно, вопросы такие:
1)Получив блокировку на строку, первый процесс должен как-то перевычислить условие where с учетом нового значения строки. Описан ли этот процесс в документации?
2)Правильно я понимаю, что с read commited нельзя полагаться даже на самые простейшие запросы?
15 фев 12, 20:01    [12098867]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
xml_loader
Guest
Можно подробнее? Потому что ваш delete должен что-либо удалить в любом случае, или запись с val=1000, или запись с val = 100.
15 фев 12, 20:15    [12098936]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
confused
Guest
автор
Можно подробнее? Потому что ваш delete должен что-либо удалить в любом случае, или запись с val=1000, или запись с val = 100.

Попробуйте сами. Красный цвет - одна сессия, зеленый - другая.

SQL> select * from test;

ID VAL
---------- ----------
0 10
1 20
2 50
3 100
4 1000



SQL> update test set val = 0 where id = 4;

1 row updated.



SQL> delete from test where val = (select max(val) from test);



SQL> commit;

Commit complete.
15 фев 12, 20:21    [12098972]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
-2-
Member

Откуда:
Сообщений: 15330
confused
Собственно, вопросы такие:
1)Получив блокировку на строку, первый процесс должен как-то перевычислить условие where с учетом нового значения строки. Описан ли этот процесс в документации?
2)Правильно я понимаю, что с read commited нельзя полагаться даже на самые простейшие запросы?
1) statement restart - вероятно в вашем случае баг.
2) нельзя полагаться на согласованность запросов между разными контекстами, например, вызов в запросе plsql-функции, которая сама делает запрос.
15 фев 12, 20:24    [12098993]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
10.2.0.4 - не воспроизводится
15 фев 12, 20:29    [12099023]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
confused
2)Правильно я понимаю, что с read commited нельзя полагаться даже на самые простейшие запросы?

можно кроме случаев, кроме заведомо неподходящих случаев как plsql function, cursor()
15 фев 12, 20:32    [12099046]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
confused
Guest
У меня такое:

BANNER
--------------------------------------------------------------------------------

Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production
PL/SQL Release 11.2.0.2.0 - Production
CORE 11.2.0.2.0 Production
TNS for 32-bit Windows: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production
15 фев 12, 20:33    [12099052]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
xml_loader
Guest
Гм, на моем Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit замечательно воспроизвелось, чем меня неподетски озадачило. :) Таки да, в одной сессии update, потом во второй delete. На этом месте delete зависает из-за блокировки. Коммитим update, и таки получаем что ничего не удалилось.
15 фев 12, 20:33    [12099054]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
Может кто-либо более полный текст кейс сделать с созданием таблицы и все такое? А то не воспроизводится.
15 фев 12, 20:46    [12099126]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
Кентурион Крысобой
Member

Откуда:
Сообщений: 202
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options

DDL:
+
SQL> create table zzz_test(id number, f01 number);

Table created.

SQL> insert into zzz_test values(1, 10);

1 row created.

SQL> insert into zzz_test values(2, 20);

1 row created.

SQL> insert into zzz_test values(3, 50);

1 row created.

SQL> insert into zzz_test values(4, 100);

1 row created.

SQL> insert into zzz_test values(5, 1000);

1 row created.

SQL> commit;

Commit complete.


SESSION #1.
SQL> update zzz_test set f01=0 where id=5;

1 row updated.

SESSION #2
SQL> delete from zzz_test where f01=(select max(f01) from zzz_test);
_ /*ждёт завершения транзакции в session #1 */

SESSION #1.
SQL> commit;

Commit complete.

SESSION #2.
1 row deleted.

SQL> select * from zzz_test;

ID F01
---------- ----------
1 10
2 20
3 50
5 0
15 фев 12, 20:47    [12099137]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7679
10.2.0.4.0 - OKAY

+
session 1
SQL*Plus: Release 10.2.0.4.0 - Production on Wed Feb 15 09:59:10 2012

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Release 10.2.0.2.0 - 64bit Production

SQL> update zzz_test set f01=0 where id=5;

1 row updated.

SQL> commit;

Commit complete.

SQL>


session 2
SQL*Plus: Release 10.2.0.4.0 - Production on Wed Feb 15 09:59:15 2012

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.


Connected to:
Oracle Database 10g Release 10.2.0.2.0 - 64bit Production

SQL> delete from zzz_test where f01=(select max(f01) from zzz_test);

1 row deleted.

SQL>
15 фев 12, 21:02    [12099214]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7679
Relic Hunter,

Прошу прощения. Это был клиент 10.2.0.4. База 10.2.0.2.
15 фев 12, 21:05    [12099226]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10340
xml_loader
Гм, на моем Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit замечательно воспроизвелось, чем меня неподетски озадачило. :)


И меня тоже. Сессия 1 выполняет SELECT. На этот момент сеcсия 2 либо уже выпoлнила UPDATE но еще не COMMITнула, либо еще не выдала UPDATE. В любом случае сеcсия 1 видит неизмененные даные. Hа момент выдачи сеcсией 1 DELETE сеcсия 2 уже выпoлнила UPDATE но еще не COMMITнула, посему сеcсия 1 висит до тех пор пока сеcсия 2 не COMMITнет. Посколько DELETE следует правилам WRITE CONSISTENCY происходит mini-rollback и DELETE по идее должн еще раз выполнить sub-query, что и происходит на 10.2.0.4.0 и удаляется ID = 3:

SQL> delete from test where val = (select max(val) from test);

1 row deleted.

SQL> select * from test
  2  /

        ID        VAL
---------- ----------
         0         10
         1         20
         2         50
         4          0

SQL> 


На 11.2.0.1.0:

SQL> delete from test where val = (select max(val) from test);

0 rows deleted.


SY.

Сообщение было отредактировано: 15 фев 12, 21:15
15 фев 12, 21:06    [12099231]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
confused
Guest
Посколько DELETE следует правилам WRITE CONSISTENCY происходит mini-rollback и DELETE по идее должн еще раз выполнить sub-query

Я в документации вообще не могу найти термин WRITE CONSISTENCY.
15 фев 12, 21:21    [12099279]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
SY
xml_loader
Гм, на моем Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit замечательно воспроизвелось, чем меня неподетски озадачило. :)


И меня тоже. ... что и происходит на 10.2.0.4.0 и удаляется ID = 3:

у тебя на 10.2.0.4 удаляется 0 или 1 строка?
15 фев 12, 21:29    [12099312]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10340
брадобрей
у тебя на 10.2.0.4 удаляется 0 или 1 строка?


SQL> select  *
  2    from v$version
  3  /

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for 32-bit Windows: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production

SQL> select * from test
  2  /

        ID        VAL
---------- ----------
         0         10
         1         20
         2         50
         3        100
         4       1000

SQL> delete from test where val = (select max(val) from test);

1 row deleted.

SQL> select * from test
  2  /

        ID        VAL
---------- ----------
         0         10
         1         20
         2         50
         4          0

SQL> 


SY.
15 фев 12, 21:45    [12099366]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
брадобрей
SY
пропущено...
И меня тоже. ... что и происходит на 10.2.0.4.0 и удаляется ID = 3:
у тебя на 10.2.0.4 удаляется 0 или 1 строка?

На 10.2.0.5.0 полная лажа удаляется строка: ID=3; VAL=100
15 фев 12, 21:46    [12099369]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
ORA__SQL
брадобрей
пропущено...
у тебя на 10.2.0.4 удаляется 0 или 1 строка?

На 10.2.0.5.0 полная лажа удаляется строка: ID=3; VAL=100

не тупи чуваг, это как раз правильно
15 фев 12, 21:47    [12099372]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
т.е. у Соломона на 10.2 тоже не воспроизводится
15 фев 12, 21:47    [12099375]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
брадобрей
ORA__SQL
пропущено...

На 10.2.0.5.0 полная лажа удаляется строка: ID=3; VAL=100

не тупи чуваг, это как раз правильно

хотя пардон,
это ведь на момент рестарта правильно, а не на момент старта селекта...
да, надо подумать
15 фев 12, 21:49    [12099380]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10340
ORA__SQL
На 10.2.0.5.0 полная лажа удаляется строка: ID=3; VAL=100


Почему полная лажа? Полная лажа (в смысле новые "правила" без предупреждения) на 11g хотя новые "правила" мне больше по душе (на первый взгляд).

SY.
15 фев 12, 21:52    [12099387]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
ну вопщем так и должно быть с т.з. write consistancy
15 фев 12, 21:52    [12099388]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
брадобрей
ORA__SQL
пропущено...На 10.2.0.5.0 полная лажа удаляется строка: ID=3; VAL=100
не тупи чуваг, это как раз правильно
Точно. Туплю ...
15 фев 12, 21:52    [12099390]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10340
брадобрей
это ведь на момент рестарта правильно, а не на момент старта селекта...


Правильно, неправильно - с точки зрения бинес логики можно пролететь и так и так. Это правила и не болеe того. До 11g было на момент рестарта. В 11g пока непонятно - "0 rows deleted" это не момент рестарта и не момент старта.

SY.

Сообщение было отредактировано: 15 фев 12, 22:06
15 фев 12, 22:05    [12099437]     Ответить | Цитировать Сообщить модератору
 Re: Oracle concurrency и consistency - недоумение и вопросы  [new]
socoban9
Member

Откуда:
Сообщений: 42
Oracle 11.2.01

SQL> delete from test where nn=(select max(nn) from test);
0 rows deleted.

повторяю в serializable:
SQL> set transaction isolation level serializable;
Transaction set.
SQL> delete from test where nn=(select max(nn) from test);
delete from test where nn=(select max(nn) from test)
*
ERROR at line 1:
ORA-08177: can't serialize access for this transaction
15 фев 12, 22:07    [12099445]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Oracle Ответить