8.2 Работа с сохраняемыми точками
X DevAPI поддерживает сохраняемые точки, которые позволяют установить именованную точку в рамках транзакции, к которой можно вернуться. Установив сохраняемые точки в транзакции, вы можете впоследствии использовать функцию отката, чтобы отменить любые операторы, выпущенные после установки сохраняемой точки. Сохраняемые точки могут быть освобождены, если они больше не нужны. В этом разделе описывается, как работать с сохраняемыми точками в X DevAPI. См. для получения справочной информации.
Установка сохраняемой точки
Сохраняемые точки идентифицируются строковым именем. Строка может содержать любые символы, разрешённые для идентификатора. Для создания сохраняемой точки используйте операцию session.setSavepoint(), которая соответствует оператору SQL . Если вы не укажете name, она будет сгенерирована автоматически. Например, выпустив:
session.setSavepoint() создаётся сохраняемая точка транзакции с автоматически сгенерированным именем, и возвращается строка с именем сохраняемой точки. Это имя может использоваться с операциями session.rollbackTo() или session.releaseSavepoint(). Операция session.setSavepoint() может вызываться несколько раз в сеансе, и каждый раз генерируется уникальное имя сохраняемой точки.
Также можно вручную определить имя сохраняемой точки, передав строку name. Например, выпустив:
session.setSavepoint('name') создаётся сохраняемая точка транзакции с указанным name, которое возвращается операцией в виде строки. Операцию session.setSavepoint(' можно вызывать несколько раз таким образом, и если name')name уже использовалось для сохраняемой точки, то предыдущая сохраняемая точка удаляется, и устанавливается новая.
Откат к сохраняемой точке
Когда в сеансе есть сохраняемые точки транзакции, можно отменить все последующие транзакции, используя операцию session.rollbackTo(), которая соответствует оператору . Например, выпустив:
session.rollbackTo('name') происходит откат к сохраняемой точке транзакции name. Эта операция выполняется успешно, пока указанная сохраняемая точка не была освобождена. Откат к сохраняемой точке, созданной до других сохраняемых точек, приводит к тому, что последующие сохраняемые точки либо освобождаются, либо отменяются. Например:
session.startTransaction()
(some data modifications occur...)
session.setSavepoint('point1') <---- succeeds
(some data modifications occur...)
session.setSavepoint('point2') <---- succeeds
(some data modifications occur...)
session.rollbackTo('point1') <---- succeeds
session.rollbackTo('point1') <---- still succeeds, but position stays the same
session.rollbackTo('point2') <---- generates an error because lines above already cleared point2
session.rollbackTo('point1') <---- still succeeds
Освобождение сохраняемой точки
Чтобы отменить сохраняемую точку, например, когда она больше не нужна, используйте releaseSavepoint() и передайте имя сохраняемой точки, которую нужно освободить. Например, выпустив:
session.releaseSavepoint('name') освобождается сохраняемая точка name.
Сохраняемые точки и неявное поведение транзакций
Точное поведение сохраняемых точек определяется сервером, и, в частности, как настроен autocommit. См. .
Например, рассмотрим следующие операторы без явного вызова , session.startTransaction() или подобного:
session.setSavepoint('testsavepoint');
session.releaseSavepoint('testsavepoint');
Если режим autocommit включён на сервере, эти операторы приводят к ошибке, потому что сохраняемая точка с именем testsavepoint не существует. Это происходит потому, что вызов session.setSavepoint() создаёт транзакцию, затем сохраняемую точку и непосредственно коммитит её. В результате к моменту вызова releaseSavepoint(), который находится в собственной транзакции, сохраняемая точка уже не существует. В этом случае, чтобы сохраняемая точка сохранилась, необходимо сначала начать явный блок транзакции.
© 2025 Oracle
Licensed under the GPLv2 License.