Как работают транзакции в хранимых процедурах Oracle? Есть ли неявная транзакция? - PullRequest
6 голосов
/ 04 октября 2010

Как мне написать транзакцию в хранимой процедуре Oracle?Нужно ли делать это явно или Oracle автоматически блокирует строки?

Ответы [ 2 ]

13 голосов
/ 04 октября 2010

Возможно, вы захотите просмотреть концептуальное руководство , в частности главу о транзакциях :

Транзакция - это логическая единица работы, которая включаетодин или несколько операторов SQL, выполняемых одним пользователем.[...] Транзакция начинается с первого исполняемого пользователем оператора SQL.Транзакция заканчивается, когда она явно подтверждена или отменена этим пользователем.

Вам не нужно явно начинать транзакцию, это делается автоматически.Вам нужно будет указать окончание транзакции с помощью фиксации (или отката).

Механизм блокировки является основной частью БД, об этом читайте в главе Параллельность и согласованность данных .


Относительно хранимых процедур

Хранимая процедура - это набор операторов, они выполняются в той же транзакции, что и вызывающий сеанс (*).Обычно управление транзакциями (фиксация и откат) принадлежит вызывающему приложению.Вызывающее приложение имеет более широкое представление о процессе (которое может включать несколько хранимых процедур) и поэтому находится в лучшем положении, чтобы определить, находятся ли данные в согласованном состоянии.Хотя вы можете зафиксировать хранимую процедуру, это не является нормой.

(*), за исключением случаев, когда процедура объявлена ​​как автономная транзакция, и в этом случае процедура выполняется как независимый сеанс (спасибо будь здесь сейчас , теперь я вижу твою точку зрения ).

1 голос
/ 04 октября 2010

@ AdamStevenson Что касается DDL, то есть ссылка на Руководство по Концепции:

Если текущая транзакция содержит любые операторы DML, Oracle сначала фиксирует транзакции, а затем запускается и фиксирует оператор DDL как новый, не замужем Оператор выписки.

Таким образом, если вы начали транзакцию до оператора DDL (например, написали операторы INSERT, UPDATE, DELETE, MERGE), запущенная транзакция будет неявно зафиксирована - вы всегда должны помнить об этом при обработке операторов DML. *

Я согласен с Винсентом Малгратом, вы можете найти очень полезную информацию об обработке транзакций в Руководстве по Концепции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...