BEGIN TRANSACTION (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure хранилище платформы Аналитики Azure Synapse Analytics (PDW) в 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 }
[ ; ]

Аргументы

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инструкция , UPDATE DELETEкоторая ссылается на удаленную таблицу на связанном сервере. Оператор 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 базу данных или AdventureWorksDW2022 пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества 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