оракул - какие заявления нужно совершить? - PullRequest
48 голосов
/ 03 марта 2012

Каков список операторов, которые необходимо зафиксировать перед дальнейшими действиями в таблице, чтобы избежать блокировки? Я не говорю о полных транзакциях с несколькими утверждениями и целостностью транзакций; вместо этого я имею в виду отдельные высказывания.

Я знаю, что вставка должна быть зафиксирована, но у truncate есть автокоммит. Каков полный список утверждений, которые необходимо совершить?

Требуется совершить (стартовый список):

UPDATE
INSERT
DELETE

Ответы [ 4 ]

52 голосов
/ 03 марта 2012

Команды DML (Язык манипулирования данными) должны быть подтверждены / отменены. Здесь - список этих команд.

Операторы языка управления данными (DML) используются для управления данными внутри объектов схемы. Некоторые примеры:

INSERT - insert data into a table
UPDATE - updates existing data within a table
DELETE - deletes all records from a table, the space for the records remain
MERGE - UPSERT operation (insert or update)
CALL - call a PL/SQL or Java subprogram
EXPLAIN PLAN - explain access path to data
LOCK TABLE - control concurrency
11 голосов
/ 03 марта 2012

В механическом смысле COMMIT совершает транзакцию.То есть транзакция - это все действие (один или несколько операторов DML), которое происходит между двумя операторами COMMIT (или ROLLBACK).

В Oracle оператор DDL является самостоятельной транзакцией просто потому, что неявный COMMIT выдается перед выполнением оператора и снова после.TRUNCATE - это команда DDL, поэтому для нее не требуется явная фиксация, поскольку при ее вызове выполняется неявная фиксация.

С точки зрения проектирования системы транзакция является бизнес-единицей работы.Он может состоять из одного оператора DML или нескольких из них.Это не имеет значения: только полные транзакции требуют COMMIT.Буквально не имеет смысла выдавать COMMIT до тех пор, пока мы не завершим целую бизнес-единицу работы.

Это ключевая концепция.COMMITs не просто снимают блокировки.В Oracle они также выпускают защелки, такие как список заинтересованных транзакций.Это оказывает влияние из-за модели согласованности чтения Oracle.Исключения, такие как ORA-01555: SNAPSHOT TOO OLD или ORA-01002: FETCH OUT OF SEQUENCE, происходят из-за неправильных фиксаций.Следовательно, для наших транзакций крайне важно удерживать блокировки так долго, как они в них нуждаются.

6 голосов
/ 03 марта 2012

DML должен быть зафиксирован или откатан.DDL не может.

http://www.orafaq.com/faq/what_are_the_difference_between_ddl_dml_and_dcl_commands

Вы можете включить автоматическую фиксацию, и это опять-таки только для DML.DDL никогда не являются частью транзакций, и поэтому нет ничего похожего на явную фиксацию / откат.

truncate - это DDL, и поэтому он фиксируется неявно.

Редактировать Я должен сказать, извините.Как и @DCookie и @APC, указанные в комментариях, существуют такие, как неявные коммиты для DDL.Смотрите здесь вопрос об этом на Спросите Тома .Это противоречит тому, что я узнал, и мне все еще немного любопытно.

3 голосов
/ 07 апреля 2014

И ключевой момент - хотя TRUNCATE TABLE выглядит как DELETE без предложения WHERE, TRUNCATE - это не DML, а DDL. DELETE требует COMMIT, а TRUNCATE - нет.

...