BEGIN TRANSACTION (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)Warehouse in Microsoft Fabric

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

Соглашения о синтаксисе Transact-SQL

Синтаксис

Синтаксис для SQL Server, База данных SQL Azure и Управляемый экземпляр SQL Azure.

BEGIN { TRAN | TRANSACTION }
    [ { transaction_name | @tran_name_variable }
      [ WITH MARK [ 'description' ] ]
    ]
[ ; ]

Синтаксис для хранилища данных Synapse в Microsoft Fabric, Azure Synapse Analytics и аналитической платформы (PDW).

BEGIN { TRAN | TRANSACTION }
[ ; ]

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

transaction_name

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

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

@tran_name_variable

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

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

WITH MARK [ 'description' ]

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

Указывает, что транзакция отмечается в журнале. Значение аргумента 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 запускает локальную транзакцию, она не записывается в журнал транзакций до тех пор, пока приложение не выполнит действие, которое должно быть записано в журнале, например выполнение инструкции или DELETE инструкцииINSERTUPDATE. Приложение может выполнять такие действия, как получение блокировок для защиты уровня SELECT изоляции транзакций инструкций, но ничего не записывается в журнале, пока приложение не выполнит действие изменения.

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

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

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

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

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

Транзакция может быть явно выполнена в виде распределенной транзакции с помощью BEGIN DISTRIBUTED TRANSACTION. Дополнительные сведения см. в разделе BEGIN DISTRIBUTED TRANSACTION.

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

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

Параметр WITH MARK приводит к тому, что имя транзакции будет помещено в журнал транзакций. При восстановлении базы данных в более раннее состояние помеченная транзакция может использоваться вместо даты и времени. Дополнительные сведения см. в разделе "Использование помеченных транзакций для последовательного восстановления связанных баз данных " и инструкций RESTORE.

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

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

BEGIN TRANSACTION <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;

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

Server: Msg 3920, Level 16, State 1, Line 3
WITH MARK option only applies to the first BEGIN TRAN WITH MARK.
The option is ignored.

Разрешения

Необходимо быть членом роли public.

Примеры

Примеры кода Transact-SQL в этой статье используют AdventureWorks2022 пример базы данных, которую можно скачать на домашней странице примеров и проектов сообщества Microsoft SQL Server.

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

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

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

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

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

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

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

C. Имя транзакции

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

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

DECLARE @TranName VARCHAR(20);
SELECT @TranName = 'MyTransaction';

BEGIN TRANSACTION @TranName;
USE AdventureWorks2022;
DELETE FROM AdventureWorks2022.HumanResources.JobCandidate
    WHERE JobCandidateID = 13;

COMMIT TRANSACTION @TranName;
GO

D. Пометить транзакцию

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

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

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