Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureAzure Synapse Analytics
Система платформы аналитики (PDW)
Хранилище в Microsoft Fabric
База данных SQL в Microsoft Fabric
Отмечает начальную точку явной локальной транзакции. Явные транзакции начинаются с инструкции BEGIN TRANSACTION и заканчиваются оператором или COMMIT операторомROLLBACK.
Соглашения о синтаксисе Transact-SQL
Syntax
Синтаксис для SQL Server, Базы данных SQL Azure, базы данных SQL Fabric и Управляемого экземпляра SQL Azure.
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
Синтаксис для хранилища данных Fabric, Azure Synapse Analytics и системы платформы аналитики (PDW).
BEGIN { TRAN | TRANSACTION }
[ ; ]
Arguments
transaction_name
Применимо к: SQL Server 2008 (10.0.x) и более поздние версии, База данных SQL Azure, База данных SQL Fabric и Управляемый экземпляр 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 Fabric и Управляемый экземпляр SQL Azure
Имя определяемой пользователем переменной, содержащей допустимое имя транзакции. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar. Если в переменную передаются более 32 символов, используются только первые 32 символа. Остальные символы усечены.
С МАРКОМ [ 'описание' ]
Применимо к: SQL Server 2008 (10.0.x) и более поздние версии, База данных SQL Azure, База данных SQL Fabric и Управляемый экземпляр SQL Azure
Указывает, что транзакция отмечается в журнале. Значение аргумента description — это строка, описывающая отметку. Описание больше 128 символов усечено до 128 символов, прежде чем храниться в msdb.dbo.logmarkhistory таблице.
Если WITH MARK используется, необходимо указать имя транзакции.
WITH MARK позволяет восстановить журнал транзакций в именованную метку.
Remarks
BEGIN TRANSACTION увеличивается @@TRANCOUNT по 1.
BEGIN TRANSACTION представляет точку, в которой данные, на которые ссылается соединение, логически и физически согласованы. Если возникают ошибки, все изменения данных, внесенные после BEGIN TRANSACTION отката, можно вернуть данные в известное состояние согласованности. Каждая транзакция длится до тех пор, пока она не завершится без ошибок и COMMIT TRANSACTION будет выдана, чтобы внести изменения в постоянную часть базы данных, или возникают ошибки, и все изменения удаляются с ROLLBACK TRANSACTION помощью инструкции.
BEGIN TRANSACTION запускает локальную транзакцию для соединения, выдавшего инструкцию. В зависимости от текущих параметров уровня изоляции транзакций многие ресурсы, полученные для поддержки инструкций Transact-SQL, выданных подключением, блокируются транзакцией, пока она не завершится с помощью инструкции COMMIT TRANSACTION или ROLLBACK TRANSACTION инструкции. Транзакции, долгое время ожидающие обработки, могут препятствовать доступу других пользователей к заблокированным ресурсам и усечения транзакций в журнале.
Хотя BEGIN TRANSACTION запускает локальную транзакцию, она не записывается в журнал транзакций до тех пор, пока приложение не выполнит действие, которое должно быть записано в журнале, например выполнение инструкции или INSERT инструкцииUPDATEDELETE. Приложение может выполнять такие действия, как получение блокировок для защиты уровня SELECT изоляции транзакций инструкций, но ничего не записывается в журнале, пока приложение не выполнит действие изменения.
Присвоение имен нескольким транзакциям в последовательности вложенных транзакций мало влияет на транзакцию. Системой регистрируется только первое (самое внешнее) имя транзакции. Откат к другому имени (не считая допустимого имени точки сохранения) приводит к формированию ошибки. В момент возникновения такой ошибки на самом деле не выполняется откат инструкций. Для этих инструкций выполняется откат только при откате внешней транзакции.
Локальная транзакция, запущенная BEGIN TRANSACTION инструкцией, передается в распределенную транзакцию, если перед фиксацией или откатом инструкции выполняются следующие действия:
Выполняется
INSERTинструкция ,DELETEUPDATEкоторая ссылается на удаленную таблицу на связанном сервере. Оператор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.
Permissions
Необходимо быть членом роли public.
Examples
Примеры кода в этой статье используют базу данных образца AdventureWorks2025 или AdventureWorksDW2025, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.
A. Использование явной транзакции
Применимо к: SQL Server 2008 (10.0.x) и более поздние версии, База данных SQL Azure, База данных SQL Fabric, Управляемый экземпляр SQL Azure, Azure Synapse Analytics, Система платформы аналитики (PDW)
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT;
B. Откат транзакции
Применимо к: SQL Server 2008 (10.0.x) и более поздние версии, База данных SQL Azure, База данных SQL Fabric, Управляемый экземпляр SQL Azure, Azure Synapse Analytics, Система платформы аналитики (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 Fabric, Управляемый экземпляр 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 Fabric, Управляемый экземпляр 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