powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Несовпадение количества
19 сообщений из 19, страница 1 из 1
Несовпадение количества
    #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
Несовпадение количества
    #39775516
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий З.,

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

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

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

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

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


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

в table2 не могли, технически это возможно, но организационно - нет. Действительно, получается что они изменились в table1, больше негде, но мне не дает покоя - каким образом!
...
Рейтинг: 0 / 0
Несовпадение количества
    #39775548
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий З.Или всё же это происходит во время создания таблицы?RTFM Data Definition Language (DDL) Statements (FAQ)
...
Рейтинг: 0 / 0
Несовпадение количества
    #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
Несовпадение количества
    #39775572
Дмитрий З.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

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


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

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

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

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

SY.

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

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

.....
stax
...
Рейтинг: 0 / 0
Несовпадение количества
    #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
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Несовпадение количества
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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