Форум: "Базы";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
ВнизЧто произойдет, если завалится длительная DDL ? Найти похожие ветки
← →
ANB © (2006-08-31 18:17) [0]Значится выполняем скрипт :
create table Test_T1 (ID integer);
/
insert into Test_T1 (ID)
select rownum from dual
connect by level <= 1000;
/
commit;
/
alter table Test_t1 add (N varchar2(200) default "Вася" not null);
/
select * from test_t1;
/
drop table test_t1;
/
Операция alter table при большом объеме данных может быть довольно длительной (я знаю, что грамотно было бы создать поле без деволта, пропадейтить и потом повесить дефолт, но интересен именно такой вариант). Что будет, если прервать именно этот альтер (например, сервак упал) ?
← →
Sam Stone © (2006-08-31 20:07) [1]Сделал тест на 10к записей. Альтер прошел мгновенно.
На 1кк успел зарубить. В итоге в таблице один столбец.
← →
Desdechado © (2006-08-31 20:14) [2]а для чего эти стресс-тесты?
← →
Petr V. Abramov © (2006-08-31 21:11) [3]по идее ничего не будет. вроде нормальная транзакция, только затрагивающая еще и словарь.
← →
Desdechado © (2006-08-31 21:19) [4]думаю, падение будет похоже на ситуацию при активном триггере
CREATE OR REPLACE TRIGGER TR_T1
BEFORE UPDATE FOR "Test_T1"
FOR EACH ROW
BEGIN
IF( :old."ID" >= 100 ) THEN
RAISE_APPLICATION_ERROR( -50000, "bla-bla" );
END IF;
END;
← →
ANB © (2006-09-01 09:03) [5]
> по идее ничего не будет. вроде нормальная транзакция, только
> затрагивающая еще и словарь.
В оракле DDL - выполняется вроде как бы не в контексте транзакции.
Это в FB любые манипуляции с БД, включая DLL - это транзакция, т.е. либо все либо ничего.
А с ораклом не совсем понятки. Вот результат
> Sam Stone © (31.08.06 20:07) [1]
показал, что фактически операций было 2, причем добавление столбца прошло, а апдейт откатился.
Просто FB - полный версионник, а оракл - его иммитация.
← →
Desdechado © (2006-09-01 11:02) [6]> причем добавление столбца прошло,
Мне мой сервер жалко так терзать, но из
> В итоге в таблице один столбец.
видно, что добавление столбца таки НЕ прошло.
← →
ANB © (2006-09-01 11:04) [7]
> Desdechado © (01.09.06 11:02) [6]
Мне мой тоже, вот я и спросил на форуме :) По идее, по принципу оракла, оператор должен выполнятся либо весь, либо весь отваливаться. Для DML так и есть.
← →
Petr V. Abramov © (2006-09-01 17:25) [8]> ANB © (01.09.06 09:03) [5]
> В оракле DDL - выполняется вроде как бы не в контексте транзакции
а в контексте чего ж он выполняется???
это другой вопрос, что сразу коммитится.
запустите длительны DDL и посмотрите v$transaction
кстати, в OCI если брать св-ва базы, есть загадочный для меня атрибут OCI_ATTR_AUTOCOMMIT_DDL. Т.е, возможно через пару версий на уровне alter session можно будет и отменить этот autocommit
← →
ANB © (2006-09-01 17:45) [9]
> Т.е, возможно через пару версий на уровне alter session
> можно будет и отменить этот autocommit
Да, было неплохо. А то как то выбивается из общей концепции. Еще неплохо бы ошибку мутации таблиц отменили.
← →
Petr V. Abramov © (2006-09-01 23:54) [10]> Еще неплохо бы ошибку мутации таблиц отменили.
это врядли, это логично в общем случае
← →
ANB © (2006-09-04 10:10) [11]
> это врядли, это логично в общем случае
Может и логично, зато жутко неудобно. В некоторых компаниях вообще триггеры не используют именно из-за этой ошибки, т.к. на нее можно нарваться довольно непредсказуемо.
Могли бы просто принять решение - в середине операции возвращать либо старые данные, либо (что более логично) ту часть, которая поменялась, возрващать уже новую (моя сессия должна видеть все изменения еще до коммита). А оракл вместо этого тупо генерит ошибку и все. Кстати, этой ошибки больше нигде не встречал (в MS SQL триггера уровня оператора и тут все понятно, но и в FB/IB я про нее не слышал). Кстати, умудрялся я получить эту ошибку даже без триггеров - только работа с пакетами.
← →
Val © (2006-09-04 10:55) [12]>[5] ANB © (01.09.06 09:03)
>[11] ANB © (04.09.06 10:10)
какие в оракле придурки работают, правда? ;)
может попытаемся почитать да понять почему ТАК происходит?
← →
ANB © (2006-09-04 10:58) [13]
> какие в оракле придурки работают, правда? ;)
1. Ну, придуроков то там хватает :) Некоторые баги ни в какие ворота не лезут.
2. Читал - все равно не понял. Т.е. логически понятно, из-за чего ошибка, а вот почему она логически не разрешима - не понятно. В IB/FB то ее нету, а они очень близки к ораклу по идеологии и языку (или таки есть ???).
← →
Desdechado © (2006-09-04 11:02) [14]table is mutating - прими как данность. Дергаться бесполезно, не будут они это менять.
Мне это тоже дико не нравилось поначалу, теперь же просто на автомате пишу обертку из 3 триггеров с пакетной переменной.
← →
ANB © (2006-09-04 11:15) [15]
> теперь же просто на автомате пишу обертку из 3 триггеров
> с пакетной переменной.
Да лениво же каждый раз так писать. А почему из трех ? Мы обычно 2 писали - один собирает строки в таблицу (в пакете), а второй уже обрабатывает ее.
> Дергаться бесполезно, не будут они это менять.
Казлы, однозначно. Но из-за этой грабли с оракла все равно не слезу :)
← →
Desdechado © (2006-09-04 11:20) [16]table is mutating - прими как данность. Дергаться бесполезно, не будут они это менять.
Мне это тоже дико не нравилось поначалу, теперь же просто на автомате пишу обертку из 3 триггеров с пакетной переменной.
← →
Desdechado © (2006-09-04 11:22) [17]Вот это проксю плющит....
Из трех - ДО на операцию, ДО на строку, ПОСЛЕ на операцию.
← →
ANB © (2006-09-04 11:24) [18]
> ДО на операцию
А "ДО на операцию" зачем ?
← →
Desdechado © (2006-09-04 12:18) [19]Инициализировать табличную переменную.
← →
ANB © (2006-09-04 12:44) [20]
> Инициализировать табличную переменную.
Дык ее можно прямо в пакете инициализировать. Так даже надежнее. А очищать в триггере оператор после. Хотя очистка в триггере оператор до понадежнее . . .
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.10.29;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.053 c