BEGIN TRANSACTION (Transact-SQL)

Область применения: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Synapse Analytics Analytics Platform System (PDW)

Отмечает начальную точку явной локальной транзакции. Явные транзакции начинаются с инструкции BEGIN TRANSACTION и заканчиваются инструкцией COMMIT или ROLLBACK.

Topic link iconСинтаксические обозначения в Transact-SQL

Синтаксис

--Applies to SQL Server and Azure SQL Database
 
BEGIN { TRAN | TRANSACTION }   
    [ { transaction_name | @tran_name_variable }  
      [ WITH MARK [ 'description' ] ]  
    ]  
[ ; ]  
--Applies to Azure Synapse Analytics and Parallel Data Warehouse
 
BEGIN { TRAN | TRANSACTION }   
[ ; ]  

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

transaction_name
Область применения: SQL Server 2008 (10.0.x) и более поздние версии, База данных SQL Azure

Имя, присвоенное транзакции. Аргумент transaction_name должен соответствовать правилам для идентификаторов, однако не допускаются идентификаторы длиннее 32 символов. Имена транзакций используются только для самых внешних вложенных инструкций BEGIN...COMMIT или BEGIN...ROLLBACK. Аргумент transaction_name всегда учитывает регистр, даже если экземпляр SQL Server регистр не учитывает.

@tran_name_variable
Область применения: SQL Server 2008 (10.0.x) и более поздние версии, База данных SQL Azure

Имя определенной пользователем переменной, содержащей допустимое имя транзакции. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar. Если переменной передается больше 32 символов, используются только 32 первых символа, а остальные усекаются.

WITH MARK [ 'description' ]
Область применения: SQL Server 2008 (10.0.x) и более поздние версии, База данных SQL Azure

Указывает, что транзакция отмечается в журнале. Значение аргумента description — это строка, описывающая отметку. Значения аргумента description длиннее 128 символов усекаются до 128 символов перед сохранением в таблице msdb.dbo.logmarkhistory.

Если используется предложение WITH MARK, необходимо указать имя транзакции. Предложение WITH MARK позволяет восстановить журнал транзакций до именованной отметки.

Общие замечания

Инструкция BEGIN TRANSACTION увеличивает значение функции @@TRANCOUNT на 1.

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

Инструкция BEGIN TRANSACTION запускает локальную транзакцию для соединения, выполняющего эту инструкцию. В зависимости от текущих параметров уровня изоляции транзакции многие ресурсы, необходимые для поддержки выполняемых соединением инструкций Transact-SQL, блокируются транзакцией до ее завершения с помощью инструкций COMMIT TRANSACTION и ROLLBACK TRANSACTION. Транзакции, долгое время ожидающие обработки, могут препятствовать доступу других пользователей к заблокированным ресурсам и усечения транзакций в журнале.

Хотя инструкция BEGIN TRANSACTION запускает локальную транзакцию, она не записывается в журнал транзакций, пока приложение не выполнит действие, которое должно быть записано в журнал, например инструкцию INSERT, UPDATE или DELETE. Приложение может выполнять такие действия, как получение блокировки для защиты уровня изоляции транзакции инструкции SELECT, но ни одно действие не записывается в журнал, пока приложение не выполнит действие, изменяющее данные.

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

Локальная транзакция, запущенная инструкцией BEGIN TRANSACTION, повышается до распределенной транзакции, если до фиксации или отката инструкции выполняются следующие действия.

  • Выполняется инструкция INSERT, DELETE или UPDATE, ссылающаяся на удаленную таблицу или связанный сервер. Инструкция INSERT, UPDATE или DELETE завершается неудачно, если поставщик OLE DB, который используется для доступа к связанному серверу, не поддерживает интерфейс ITransactionJoin.

  • Вызывается удаленная хранимая процедура, если для параметра REMOTE_PROC_TRANSACTIONS установлено значение ON.

Локальная копия SQL Server становится контроллером транзакции и использует координатор распределенных транзакций Microsoft (MS DTC) для управления распределенной транзакцией.

Транзакция может выполняться явно как распределенная с помощью инструкции BEGIN DISTRIBUTED TRANSACTION. Дополнительные сведения см. в статье BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Если SET IMPLICIT_TRANSACTIONS задано как ON, то инструкция BEGIN TRANSACTION создает две вложенные транзакции. Дополнительные сведения см. в статье SET IMPLICIT_TRANSACTIONS (Transact-SQL).

Помеченные транзакции

Если используется параметр WITH MARK, имя транзакции помещается в журнал транзакций. При восстановлении базы данных из копии до прежнего состояния вместо даты и времени может использоваться помеченная транзакция. Дополнительные сведения см. в статьях Согласованное восстановление связанных баз данных с помощью помеченных транзакций и Инструкции RESTORE (Transact-SQL).

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

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

Инструкцию BEGIN TRAN new_name WITH MARK можно вложить в уже существующую непомеченную транзакцию. При этом значением параметра new_name становится имя метки транзакции несмотря на то, что транзакция может иметь имя. В следующем примере M2 является именем метки.

BEGIN TRAN T1;  
UPDATE table1 ...;  
BEGIN TRAN M2 WITH MARK;  
UPDATE table2 ...;  
SELECT * from table1;  
COMMIT TRAN M2;  
UPDATE table3 ...;  
COMMIT TRAN T1;  

При существовании вложенности транзакций попытка отметить транзакцию, уже имеющую метку, приводит к следующему предупреждению (не ошибке):

BEGIN TRAN T1 WITH MARK ...;

UPDATE table1 ...;

BEGIN TRAN M2 WITH MARK ...;

"Сервер: сообщение 3920, уровень 16, состояние 1, строка 3"

«Параметр WITH MARK применяется только к первой инструкции BEGIN TRAN WITH MARK.»

«Параметр не обрабатывается.»

Разрешения

Требуется членство в роли public.

Примеры

A. Использование явной транзакции

Область применения: SQL Server 2008 (10.0.x) и более поздние версии, База данных SQL Azure, Azure Synapse Analytics, Parallel Data Warehouse

В примере используется база данных AdventureWorks.

BEGIN TRANSACTION;  
DELETE FROM HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
COMMIT;  

Б. Откат транзакции

Область применения: SQL Server 2008 (10.0.x) и более поздние версии, База данных SQL Azure, Azure Synapse Analytics, Parallel Data Warehouse

В приведенном ниже примере демонстрируется результат отката транзакции. В этом примере инструкция ROLLBACK приведет к откату инструкции INSERT, но созданная таблица будет по-прежнему существовать.

CREATE TABLE ValueTable (id INT);  
BEGIN TRANSACTION;  
       INSERT INTO ValueTable VALUES(1);  
       INSERT INTO ValueTable VALUES(2);  
ROLLBACK;  

В. Присвоение транзакции имени

Область применения: SQL Server 2008 (10.0.x) и более поздние версии, База данных SQL Azure

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

DECLARE @TranName VARCHAR(20);  
SELECT @TranName = 'MyTransaction';  
  
BEGIN TRANSACTION @TranName;  
USE AdventureWorks2012;  
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
  
COMMIT TRANSACTION @TranName;  
GO  

Г. Пометка транзакции

Область применения: SQL Server 2008 (10.0.x) и более поздние версии, База данных SQL Azure

В следующем примере показано, как пометить транзакцию. Транзакция CandidateDelete помечена.

BEGIN TRANSACTION CandidateDelete  
    WITH MARK N'Deleting a Job Candidate';  
GO  
USE AdventureWorks2012;  
GO  
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
GO  
COMMIT TRANSACTION CandidateDelete;  
GO  

См. также:

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)