Галерея
7757 8119 8300 8698 8817 9504 9722 9937
Интересные записи
Топовые новости
Новое

Инструкция START TRANSACTION

Инструкция START TRANSACTION позволяет использовать все возможности инструкции SET TRANSACTION и, кроме того, запустить новую транзакцию.


Синтаксис SQL 2003

START TRANSACTION [READ ONLY | READ WRITE]
[ISOLATION LEVEL {READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE}
[DIAGNOSTIC SIZE mt]

Согласно стандарту ANSI единственное отличие между инструкциями SET и START состоит в том, что SET используется все текущей транзакции, a STARТ считается началом новой транзакции. Таким образом, параметры SET TRANSACT/ON применяются к следующей транзакции, а параметры START TRANSACTION применяются к текущей транзакции.

Инструкцию START TRANSACTION поддерживает только MySQL, и три производителя (MySQL, PostgreSQL и SQL Server) поддерживают сходную команду BEGIN [TRANSACTION]] и ее синоним BEGIN [WORK]. Инструкция BEGIN TRANSACTION объявляет явную транзакцию, но не указывает уровни изоляции.


Общие правила

Единственное существенное правило использования инструкции START TRANSACTION состоит в том, что вы должны использовать эту инструкцию для управления режимом доступа, уровнем изоляции или объемом диагностической информации для текущей транзакции. Как только запускается новая транзакция, вы должны либо указывать новые значения параметров, либо использовать заданные по умолчанию.

Большинство платформ позволяют неявным образом управлять транзакциями, для чего используется то, что называется режимом автоматической фиксации (autocommit mode). В этом режиме база данных рассматривает каждую инструкцию как отдельную транзакцию, с неявными инструкциями BEGIN TRAN и COMMIT TRAN.

Альтернативой режиму автоматической фиксации является явное ручное управление каждой транзакцией. При явном управлении вы объявляете каждую новую транзакцию при помощи инструкции START TRANSACTION. Новая транзакция также может быть запущена неявно при каждом запуске инициирующей транзакцию инструкции, такой, как INSERT, UPDATE, DELETE или SELECT. Транзакция не будет фиксироваться или откатываться до тех пор, пока не будет явно выполнена инструкция COMMIT или ROLLBACK.

Некоторые платформы, а именно DB2 и Oracle, не поддерживают явное объявление новой транзакции при помощи инструкции START TRANSACTION, но они поддерживают явную фиксацию, создание точки сохранения и откат транзакции. Другие платформы, такие, как MySQL, PostgreSQL и SQL Server, разрешают как явное объявление транзакции при помощи инструкции START TRANSACTION, так и явную фиксацию, создание точки сохранения и откат транзакции.


Советы и хитрости программирования

Многие платформы, описываемые в этой книге, по умолчанию работают в режиме автоматической фиксации. Следовательно, хорошей практикой является использование явного объявления транзакций только в том случае, если вы применяете этот метод во всех транзакциях сеанса. Иными словами, не смешивайте неявно и явно объявленные транзакции в одном сеансе. Каждая явно объявленная транзакция будет зафиксирована только после выполнения инструкции COMMIT. Точно так же транзакция, завершившаяся неудачно, или та, которая должна быть отменена, должна отменяться явно, при помощи инструкции ROLLBACK.

Инструкцию START используйте только в паре с COMMIT или ROLLBACK. Иначе СУБД может не завершить транзакцию до тех пор, пока не встретит инструкцию COMMIT или ROLLBACK. Отсутствие необходимых инструкций COMMIT (и ROLLBACK) может привести к огромным, плохо спланированным транзакциям.

Хорошей практикой является использование явных инструкций COMMIT и ROLLBACK после одной или небольшого числа инструкций, поскольку долго выполняющиеся транзакции могут блокировать ресурсы, не давая доступа к ним другим пользователям. И не забывайте о фиксации (или откате)! Долго выполняющиеся или объемные транзакционные пакеты могут переполнить сегменты отката или журналы транзакций базы данных, особенно если файлы имеют небольшой размер.


DB2

Не поддерживается. Транзакции в DB2 запускаются неявно.


MySQL

Платформа MySQL обычно работает в режиме автоматической фиксации. Это означает, что изменения записываются на диск автоматически по их завершении. Если по какой-то причине изменение внести не удается, происходит автоматический откат.

Платформа MySQL поддерживает инструкцию START TRANSACTION, но она является просто синонимом инструкции BEGIN. Вы можете отложить автоматическую фиксацию для одной или нескольких инструкций, используя следующий синтаксис инструкции BEGIN.

BEGIN [WORK]

Где:

BEGIN

Обозначает начало одной или нескольких транзакций.

WORK

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

SET AUTOCOMMIT=0

Как только вы отключили автоматическую фиксацию, для записи любых модификаций на диск становится необходимой инструкция COMMIT, а для отмены внесенных изменений становится необходимой инструкция ROLLBACK. Отключение режима автоматической фиксации работает только для «таблиц с безопасной транзакцией» (transaction-safe tables), таких, как таблицы InnoDB и BDB. Отключение этого режима в прочих таблицах никакого эффекта не оказывает. Режим остается включенным.

Транзакции сохраняются в двоичном формате в журнале, для чего используется одна операция записи при выполнении инструкции COMMIT. Ниже приводится пример.

BEGIN;
SELECT @А:=SUM(salary) FROM employee WHERE type=1;
UPDATE payhistory SET summmary=@A WHERE type=1;
COMMIT;

Откат, выполненный в нетранзакционной таблице, вызывает ошибку ERWARNINGNOTCOMPLETEROLLBACK, а откат в таблице с безопасными транзакциями выполняется нормально.


Oracle

Не поддерживается. Транзакции в Oracle запускаются неявно. За дополнительными сведениями о том, как в Oracle осуществляется управление отдельными транзакциями, обращайтесь к подразделу Oracle раздела об инструкции SET TRANSACTION.


PostgreSQL

Синтаксис данной инструкции в PostgreSQL следующий.

BEGIN [WORK | TRANSACTION]

В ранних версиях MySQL использовался журнал обновлений. Однако журнал обновлений не поддерживает транзакции ANSI, если только таблицы не определены как InnoDB или BDB.

Где:

BEGIN

Обозначает начало одной или нескольких транзакций.

WORK

Дополнительное ключевое слово, не несущее функциональной нагрузки.

TRANSACTION

Дополнительное ключевое слово, не несущее функциональной нагрузки.

Обычно PostgreSQL работает в режиме автоматической фиксации, когда каждая инструкция по модификации данных или запрос представляет собой отдельную транзакцию. Платформа PostgreSQL неявно выполняет инструкцию COMMIT в транзакции, которая завершается без ошибок. Если при выполнении транзакции возникает ошибка, то PostgreSQL автоматически выполняет инструкцию ROLLBACK. Инструкция BEGIN позволяет явно зафиксировать или откатить транзакцию, которая может состоять из нескольких инструкций.

Транзакции, обозначенные вручную, в PostgreSQL работают гораздо быстрее транзакций с автоматической фиксацией. Чтобы обеспечить изоляцию транзакции, нужно установить уровень SERIALIZABLE с помощью инструкции SET TRANSACTION ISOLATION LEVEL. Платформа PostgreSQL позволяет использовать в блоке BEGIN…COMMIT несколько инструкций по модификации данных (INSERT, UPDATE, DELETE). Однако при выполнении команды COMMIT выполняется или не выполняется вся такая транзакция.

Команда BEGIN имеет еще один способ применения на тех платформах, которые поддерживают собственный процедурный язык, то есть в Oracle и SQL Server. На этих платформах команда BEGIN без ключевого слова TRANSACTION используется для обозначения нового блока процедурного кода. Поэтому для транзакций в PostgreSQL рекомендуется использовать ключевое слово TRANSACTION, поскольку иначе вы столкнетесь со сложными проблемами переносимости, если вдруг захотите перенести свой код в Oracle или SQL Server.

Ниже приводится пример инструкции BEGIN TRANSACTION в PostgreSQL.

BEGIN TRANSACTION;
INSERT INTO jobs(job_id, job_desc, min_lvl, max_lvl)
VALUES(15, ‘Chief Operating Officer’, 185, 135)
COMMIT;


SQL Server

Платформа Microsoft SQL Server поддерживает вместо инструкции START TRANSACTION стандарта ANSI инструкцию BEGIN TRANSACTION. Также поддерживается пара расширений, которые облегчают резервное копирование и восстановление транзакций. Синтаксис Microsoft SQL Server следующий.

BEGIN TRANSACTION] [дескриптор_транзакции [WITH MARK [‘дескриптор_журнала’]]]

Где:

TRANSACTION]

Обозначает начало транзакции. Допустимы ключевые слова TRAN или TRANSACTION.

дескриптор транзакции

Имя длиной до 32 символов, используемое для идентификации транзакции. Также может быть строковой переменной (CHAR, NCHAR, VARCHAR, NVARCHAR) длиной до 32 символов. При работе с вложенными транзакциями имя присваивается только внешней.

WITH MARK ‘дескриптор_журнала’

Платформа SQL Server помещает в журнал транзакций метку с именем дескрип-тор_журнала. Это позволяет SQL Server провести восстановление по протоколу транзакции до указанной метки. По сути это возможность восстановления по имени метки к состоянию на определенный момент времени для базы данных, находящейся в режиме восстановления FULL. Предложение WITH MARK должно использоваться только с именованной транзакцией.

При использовании вложенных транзакций только внешний блок BEGIN…COMMIT или BEGIN…ROLLBACK может ссылаться на имя транзакции (если оно есть). Как правило, мы не рекомендуем использовать вложенные транзакции.

Ниже приводится набор инструкций INSERT для SQL Server, которые все выполняются в одной транзакции.

BEGIN TRANSACTION
INSERT INTO sales VALUES (17896′, ‘JR3435’, ‘Oct 28 2003’.25, ‘Net 60’, ‘BU7832’)
INSERT INTO sales VALUES(‘7901’, ‘JR3435’, ‘Oct 28 2003’, 17, ‘Net 30’, ‘BU7832’)
INSERT INTO sales VALUES(‘7907’, ‘JR3435’.’Oct 28 2003′, 6, ‘Net 15’, ‘BU7832’)
COMMIT GO

Если по какой-то причине любой из этих инструкций приходится ждать своею выполнения, это означает, что они все будут ждать, поскольку они рассматриваются как единая транзакция.

Источник