Соответствует ли этот код 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

Другие вопросы по тегам