Соответствует ли этот код PL/SQL ACID?
Можно ли выдавать асинхронные коммиты на ВРЕМЕННЫЕ таблицы? Делает ли это мои транзакции менее долговечными?
CREATE GLOBAL TEMPORARY TABLE my_table_tmp (id number) ON COMMIT PRESERVE ROWS;
CREATE TABLE my_table (id number);
BEGIN
INSERT --+ append
INTO my_table_tmp (id)
SELECT rownum
FROM all_objects;
COMMIT WRITE BATCH NOWAIT; -- continue working without waiting on LGWR
INSERT INTO my_table (id)
SELECT id
FROM my_table_tmp;
COMMIT; -- actually preserve transaction
END;
/
Редактировать:
Да, я понимаю, что это не строго ACID, потому что он обходит часть D на долю секунды. Вопрос в том, является ли он "столь же хорошим", как ACID, потому что нет никакого возможного сценария, в котором он отличается от версии, в которой используются только реальные COMMIT? Или я ошибаюсь и может быть разница?
1 ответ
Одним словом, нет. D в ACID означает Durability, что означает, что фиксация на 100% гарантирует сохранение транзакции, даже если база данных должна аварийно завершить работу сразу после этого. Асинхронная фиксация предоставляет возможность для нарушения этого аспекта ACID.
Более подробная информация о преимуществах / недостатках использования асинхронной фиксации находится здесь: http://www.orafaq.com/node/93