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

Инструкция COMMIT

Инструкция COMMIT явным образом закрывает открытую транзакцию и делает изменения в базе данных постоянными. Открываться транзакции могут неявно, например при выполнении инструкций INSERT, UPDATE или DELETE, или явно, с помощью инструкции START. В любом случае открытая транзакция закрывается явно командой COMMIT.


Синтаксис SQL 2003

COMMIT [WORK] [AND [NO] CHAIN]


Ключевые слова

COMMIT [WORK]

Заканчивает текущую открытую транзакцию и записывает данные, которыми манипулировала транзакция, в базу данных. Необязательное ключевое слово WORK является пустым, не оказывает никакого влияния.

AND [NO] CHAIN

Параметр AND CHAIN указывает, что СУРБД должна работать со следующей транзакцией так, как если бы она была частью текущей транзакции. В результате эти две транзакции, будучи отдельными частями работы, совместно используют общую среду транзакции (например, уровень изоляции). Если использовать необязательное ключевое слово NO, СУБД получит явное указание использовать действия, принятые в стандарте ANSI по умолчанию. Слово COMMIT без других ключевых слов функционально эквивалентно инструкции COMMIT WORK AND NO CHAIN.

В простых случаях вы будете осуществлять транзакции (то есть выполнять код SQL, который манипулирует данными и объектами базы или изменяет их) без явного их объявления. Однако лучше всего управлять транзакциями, если явно включить их в инструкцию COMMIT. Поскольку записи и даже целые таблицы могут оказаться заблокированы на время выполнения транзакции, чрезвычайно важно, чтобы транзакции выполнялись как можно быстрее. Следовательно, ручной запуск команды COMMIT с транзакцией может помочь справиться с проблемами, связанными с одновременным использованием базы и блокировкой.

Самая важная хитрость состоит в том, чтобы понять, что некоторые базы данных выполняют автоматические неявные транзакции, а другие базы требуют явного их указания. Если вы сделаете необоснованное допущение, что платформа использует один метод выполнения транзакций, а не другой, вы можете за это поплатиться. Следовательно, при переходе с одной платформы на другую вы должны использовать стандартный, заранее установленный метод обращения с транзакциями. Мы рекомендуем всегда использовать явные транзакции с инструкцией START TRAN в начале (если платформа ее поддерживает) и COMMIT или ROLLBACK в конце.

Помимо завершения одной или нескольких операций по манипулированию данными инструкция COMMIT оказывает интересное влияние на другие аспекты транзакции, Во-первых, она закрывает все связанные с ней открытые курсоры. Во-вторых, все временные таблицы, для которых указано предложение ON COMMIT DELETE ROWS (дополнительное предложение в инструкции CREATE TABLE), очищаются. В-третьих, проверяются все отложенные ограничения (deferred constraints). Если хоть одно из них не выполняется, транзакция отменяется. И наконец, снимаются все блокировки, созданные при транзакции. Пожалуйста, обратите внимание, что в SQL 2003 определяется, что транзакции открываются неявно при выполнении следующих инструкций:

  • ALTER
  • CLOSE
  • COMMIT AND CHAIN
  • CREATE
  • DELETE
  • DROP
  • FETCH
  • FREE LOCATOR
  • GRANT
  • HOLD LOCATOR
  • INSERT
  • OPEN
  • RETURN
  • REVOKE
  • ROLLBACK AND CHAIN
  • SELECT
  • START TRANSACTION
  • UPDATE

Если вы не открыли явным образом транзакцию при запуске одной из указанных выше команд, то в соответствии со стандартом платформа СУРБД откроет транзакцию сама.


DB2

В DB2 поддерживается стандарт, за исключением Предложения AND [NO] CHAIN.


MySQL

В MySQL команда COMMIT и транзакции поддерживаются только в таблицах InnoDB. Предложение AND [NO] CHAIN не поддерживается.


Oracle

В Oracle поддерживается стандарт, за исключение предложения AND [NO] CHAIN. Кроме этого, в Oracle есть пара расширений стандартной инструкции.

COMMIT [WORK] [{COMMENT ‘текст’ | FORCE ‘текст’, [, int]}];

Где:

COMMENT ‘текст’

Связывает с текущей транзакцией комментарий. ‘Текст’ — это литеральная строка длиной до 255 символов. Текстовая строка, на случай отмены транзакции, хранится в представлении-словаре данных Oracle DBA_2PC_PENDING с ID транзакции.

Позволяет вручную выполнить сомнительную распределенную транзакцию. ‘Текст’- это литеральная строка, определяющая локальный или глобальный ID транзакции. Определить ID транзакции можно, послав запрос к представлению-словарю данных Oracle DBA_2PC_PENDING. Необязательный параметр int представляет собой целое число, которое явным образом присваивает транзакции системный номер изменения (system change number, SCN). Если параметр int. не указывается, транзакция выполняется с текущим SCN.

При подаче команды COMMIT с предложением FORCE будет совершена только та транзакция, которая явно указана в предложении FORCE. Это не окажет влияния на текущую транзакцию, если она не будет явно определена. Предложение FORCE не используется в инструкциях PL/SQL.

В следующем примере выполняется транзакция, с которой связывается комментарий.

CWK1T WORK COMMENT ‘сомнительная транзакция, звоните (549) 555-234’;


PostgreSQL

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

COMMIT [WORK i TRANSACTION]

В PostgreSQL ключевые слова WORK и TRANSACTION являются необязательными. При подаче команды COMMIT все открытые транзакции записываются на диск и результаты этих транзакций становятся видимыми для других пользователей. Например:

INSERT INTO table VAlUES(‘7896’, ‘JR3435’, ‘Oct 28 1997’, ‘Net 60’, ‘HU7832’) COMMIT WORK;


SQL Server

SQL Server поддерживает предложение AND [NO] CHAIN. SQL Server поддерживает ключевое слово TRANSACTION как эквивалент слова WORK. Синтаксис следующий.

COMMIT {[TRANSACTION] [имя.транзакции] | [WORK]}

Платформа Microsoft SQL Server позволяет создавать специфические именованные транзакции с помощью инструкции START TRAN. Синтаксическая конструкция COMMIT TRANSACTION позволяет явно указать имя транзакции при ее закрытии или для сохранения имени транзакции в переменной. Любопытно, что SQL Server все равно выполняет только самую последнюю открытую транзакцию, не учитывая введенное имя транзакции.

Когда вы используете команду COMMIT WORK, SQL Server завершает все открытые транзакции и записывает все изменения в базу данных. При использовании команды COMMIT WORK вы можете не указывать имя транзакции.

Источник