Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Несовпадение количества / 19 сообщений из 19, страница 1 из 1
18.02.2019, 12:59
    #39775506
Дмитрий З.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Добрый день! Может кто знает почему так может получаться.
Есть таблица (table1), надо перелить данные из нее в другую. Для начала она блокируется
Код: plsql
1.
LOCK TABLE table1 IN EXCLUSIVE MODE WAIT 30;


и я считаю количество строк в ней
Код: plsql
1.
select count(*) into cnt_dirty from table1;


потом создаю промежуточную таблицу на основе table1
Код: plsql
1.
execute immediate ('create table table2 as select * from table1');


и считаю сколько в нее строчек пришло
Код: plsql
1.
execute immediate 'select count(*) from table2' into cnt_temp;


дальше сравниваю
Код: plsql
1.
2.
3.
4.
--Если вдруг, внезапно, ни с того ни с сего, количества разошлись, то кричим ALARM!
if cnt_temp<>cnt_dirty then
  raise_application_error(-20000,'Обнаружено несовпадение количества в "грязной" таблице с количеством во временной таблице-клоне!'); 
end if; 


И вот иногда случаются такие моменты когда эти количества расходятся. Как такое может быть? Ведь я блокирую таблицу!
...
Рейтинг: 0 / 0
18.02.2019, 13:06
    #39775516
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Дмитрий З.,

такое как только не может быть.
вы лучше расскажите, что за задачу пытаетесь решить. возможно, выбранный вами для этого способ - не самый лучший.
...
Рейтинг: 0 / 0
18.02.2019, 13:13
    #39775520
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Дмитрий З.Ведь я блокирую таблицу!В момент create table могли измениться строки в table1, а к моменту последующего select еще и в table2.
...
Рейтинг: 0 / 0
18.02.2019, 13:14
    #39775523
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Дмитрий З.,

execute immediate ('create table table2 as select * from table1');

снимит блокировку

....
stax
...
Рейтинг: 0 / 0
18.02.2019, 13:31
    #39775542
Дмитрий З.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Stax,

Даже если блокировка снята при создании table2, то подсчет количества в table1 идет до этого, и тут блокировка должна стоять и создание table2 идет еще при блокировке. Пусть после этого блокировка снимается, но это же должно происходить после выполнения
Код: plsql
1.
execute immediate ('create table table2 as select * from table1');


а не во время. Или всё же это происходит во время создания таблицы? Признаюсь, я не в курсе как Оракл ведет себя в этом случае.
...
Рейтинг: 0 / 0
18.02.2019, 13:34
    #39775544
Дмитрий З.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
-2-,

в table2 не могли, технически это возможно, но организационно - нет. Действительно, получается что они изменились в table1, больше негде, но мне не дает покоя - каким образом!
...
Рейтинг: 0 / 0
18.02.2019, 13:49
    #39775548
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Дмитрий З.Или всё же это происходит во время создания таблицы?RTFM Data Definition Language (DDL) Statements (FAQ)
...
Рейтинг: 0 / 0
18.02.2019, 14:11
    #39775568
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Дмитрий З.,

Запросто
Код: plsql
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.
SQL> select count(*) from table1;

  COUNT(*)
----------
         1

SQL> LOCK TABLE table1 IN EXCLUSIVE MODE WAIT 5;

Table(s) Locked.

 в другой сессии
SQL> ed
Wrote file afiedt.buf

  1  begin
  2  insert into table1 values(0);
  3  commit;
  4* end;
SQL> /

 ждем


 в первой
SQL> create table stax12345 as select * from table1;

Table created.

SQL> select count(*) from stax12345;

  COUNT(*)
----------
         2



....
stax
...
Рейтинг: 0 / 0
18.02.2019, 14:23
    #39775572
Дмитрий З.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Elic,

проблема не в том что блокировка слетает ПОСЛЕ выполнения
Код: plsql
1.
execute immediate ('create table table2 as select * from table1');


а в том что похоже это происходит во время создания таблицы, перед тем как заливаются данные из select * from table1
хотя это одна SQL-команда, но выполняется она, видимо, в 2 этапа.
Ладно, спасибо всем за участие, мне было просто интересно почему так происходит.
...
Рейтинг: 0 / 0
18.02.2019, 14:38
    #39775582
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Дмитрий З.проблема не в том что блокировка слетает ПОСЛЕ выполненияПрактикуешься в черессловном скорочтении?
...
Рейтинг: 0 / 0
18.02.2019, 14:41
    #39775584
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Дмитрий З.похожеЛамер построил свою личную маленькую модель мира.
...
Рейтинг: 0 / 0
18.02.2019, 15:29
    #39775634
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Дмитрий З.блокировка слетает
Никто никуда не слетает.
Просто DDL в oracle дважды фиксирует транзакцию - до и после.
Со всеми вытекающими.
...
Рейтинг: 0 / 0
18.02.2019, 15:46
    #39775656
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
andrey_anonymousДмитрий З.блокировка слетает
Никто никуда не слетает.
Просто DDL в oracle дважды фиксирует транзакцию - до и после.
Со всеми вытекающими.

Что в результате нарушает ACID. Так-что по большому счету CTAS должен бы пыполнять SELECT AS OF SCN первого commit.

SY.
...
Рейтинг: 0 / 0
18.02.2019, 15:56
    #39775666
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
andrey_anonymousПросто DDL в oracle дважды фиксирует транзакцию - до и после.Кстати, уже не всегда.
PTT
...
Рейтинг: 0 / 0
18.02.2019, 16:05
    #39775682
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
SYЧто в результате нарушает ACID.Да ну? И фантомы есть?
SYТак-что по большому счету CTAS должен бы пыполнять SELECT AS OF SCN первого commit.Какая разница-то?
...
Рейтинг: 0 / 0
18.02.2019, 16:11
    #39775692
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
Первый commit отпустит exclusive lock и есть вероятность изменения таблицы до того как select зафиксирует свой AS OF SCN. Т.e. вопрос о точке statement level read consistency для CTAS.

SY.
...
Рейтинг: 0 / 0
18.02.2019, 16:24
    #39775704
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
SYПервый commit отпустит exclusive lockПри чём здесь это? Вы с ТС ожидаете чего-то неестественного.
...
Рейтинг: 0 / 0
18.02.2019, 17:26
    #39775782
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
SYПервый commit отпустит exclusive lock и есть вероятность изменения таблицы до того как select зафиксирует свой AS OF SCN. Т.e. вопрос о точке statement level read consistency для CTAS.

SY.

я ж привел пример 21813015

если с табличкой активно работают, то LOCK TABLE ничего не дает (лишний)

.....
stax
...
Рейтинг: 0 / 0
18.02.2019, 17:56
    #39775809
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Несовпадение количества
StaxSYПервый commit отпустит exclusive lock и есть вероятность изменения таблицы до того как select зафиксирует свой AS OF SCN. Т.e. вопрос о точке statement level read consistency для CTAS.
SY.
я ж привел пример 21813015

Код: plsql
1.
2.
3.
4.
select timestamp_to_scn(sysdate) from dual;
<тут играем>
select count(*) from table1 as of scn(260178539998);
create table table2 as select * from table1 as of scn(260178539998);
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Несовпадение количества / 19 сообщений из 19, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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