Требуется ли COMMIT после каждого EXECUTE IMMEDIATE?
У меня есть несколько команд EXECUTE IMMEDIATE в рамках одной процедуры оракула.
EXECUTE IMMEDIATE 'DELETE FROM tbl1';
EXECUTE IMMEDIATE 'INSERT INTO tbl1...';
COMMIT;
EXECUTE IMMEDIATE 'DELETE FROM tbl3';
EXECUTE IMMEDIATE 'INSERT INTO tbl3 ...';
COMMIT;
EXECUTE IMMEDIATE 'DELETE FROM tbl4';
EXECUTE IMMEDIATE 'INSERT INTO tbl4 ...';
COMMIT;
Нужны ли мне все эти COMMIT или только в конце процедуры?
2 ответа
Единственные случаи, когда вы действительно вынуждены совершать какие-либо действия, кроме как в конце бизнес-транзакции, это:
- При выполнении DDL: выполнение DDL заключено в пару неявных коммитов.
- После прямой вставки пути: таблица не может быть прочитана, пока вставка не будет зафиксирована.
Как комментирует, правильная точка для фиксации - это когда бизнес-операция завершена. В противном случае вам необходимо написать себе некоторый код для обнаружения и исправления частично выполненных и подтвержденных транзакций, покинувших базу данных, в логически несовместимом состоянии (например, существует запись INVOICE без каких-либо записей INVOICE_DETAIL).
Фиксация не требуется после каждого НЕПОСРЕДСТВЕННОГО НЕМЕДЛЕННОГО. Некоторые операторы НЕ требуют фиксации; например, если вы усекаете таблицу с помощью TRUNCATE. Усечение выполнено, и фиксация не требуется. без ROLLBACK либо. Вы должны знать, что COMMIT и ROLLBACK являются атрибутами сеанса. Все незавершенные работы в рамках текущей транзакции фиксируются или откатываются - не только оператор, выполняемый EXECUTE IMMEDIATE.