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