Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к: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 Azure, базы данных SQL в Microsoft Fabric.
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 Azure, база данных SQL в Microsoft Fabric.
Имя, назначенное транзакции.
transaction_name должны соответствовать правилам для идентификаторов, но идентификаторы, превышающие 32 символа, не допускаются. Используйте имена транзакций BEGIN...COMMIT только во внешней паре или BEGIN...ROLLBACK операторах.
transaction_name всегда учитывает регистр, даже если экземпляр ядра СУБД не учитывает регистр.
@tran_name_variable
Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.
Имя определяемой пользователем переменной, содержащей допустимое имя транзакции. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar. Если в переменную передаются более 32 символов, используются только первые 32 символа. Остальные символы усечены.
С МАРКОМ [ 'описание' ]
Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.
Указывает, что транзакция помечена в журнале транзакций. Значение аргумента description — это строка, описывающая отметку. Описание больше 128 символов усечено до 128 символов, прежде чем храниться в msdb.dbo.logmarkhistory таблице.
Если WITH MARK используется, необходимо указать имя транзакции.
WITH MARK позволяет восстановить журнал транзакций до точки, определенной меткой.
Remarks
BEGIN TRANSACTION увеличивается @@TRANCOUNT по 1.
BEGIN TRANSACTION представляет точку, в которой данные, на которые ссылается сеанс, имеет определенное состояние согласованности. Все изменения данных, внесенные после BEGIN TRANSACTION отката, можно вернуть данные в известное состояние согласованности. Каждая транзакция длится до тех пор, пока COMMIT TRANSACTION не будет выдано изменение постоянной части базы данных, или все изменения удаляются с ROLLBACK TRANSACTION помощью инструкции.
Транзакция может быть автоматически откатена при возникновении ошибки прерывания транзакции или при возникновении какой-либо ошибки во время выполнения, а XACT_ABORT параметр сеанса имеет значение ON. Дополнительные сведения см. в разделе SET XACT_ABORT.
BEGIN TRANSACTION запускает локальную транзакцию для сеанса, выдавшего инструкцию. В зависимости от текущих параметров уровня изоляции транзакций ресурсы, приобретенные для поддержки инструкций Transact-SQL, выданных сеансом, блокируются транзакцией, пока она не завершится с оператором или ROLLBACK TRANSACTION операторомCOMMIT TRANSACTION. Транзакции, оставшиеся невыполненными в течение длительного периода времени, могут препятствовать другим сеансам доступа к этим заблокированным ресурсам, а также может препятствовать усечению журнала транзакций и очистке хранилища версий.
Хотя BEGIN TRANSACTION запускает локальную транзакцию, она не записывается в журнал транзакций до тех пор, пока приложение не выполнит действие, которое должно быть записано в журнале, например выполнение инструкции или INSERT инструкцииUPDATEDELETE. После запуска транзакции ядро СУБД может выполнять такие действия, как получение блокировок для защиты уровня SELECT изоляции транзакций инструкций, но ничего не записывается в журнале транзакций, пока приложение не выполнит действие изменения.
После выдачи BEGIN TRANSACTIONможно снова запустить BEGIN TRANSACTION одну или несколько внутренних транзакций. Несмотря на то, что можно указать transaction_name для внутренней транзакции, в системе зарегистрировано только первое (внешнее) имя транзакции. Откат к любому другому имени (кроме допустимого имени точки сохранения) создает ошибку без отката каких-либо инструкций. Для этих инструкций выполняется откат только при откате внешней транзакции.
Локальная транзакция, запущенная BEGIN TRANSACTION инструкцией, повышается до распределенной транзакции, если перед фиксацией или откатом инструкции выполняются следующие действия:
Выполняется
INSERTинструкция ,DELETEUPDATEкоторая ссылается на удаленную таблицу на связанном сервере. ОператорINSERT,UPDATEилиDELETEинструкция завершается ошибкой, если поставщик OLE DB, используемый для доступа к связанномуITransactionJoinсерверу, не поддерживает интерфейс.Вызов выполняется к удаленной хранимой процедуре, когда
REMOTE_PROC_TRANSACTIONSпараметр заданON.
Локальный экземпляр ядра СУБД становится контроллером транзакций и использует координатор распределенных транзакций Майкрософт (MS DTC) для управления распределенной транзакцией.
Транзакция может быть явно выполнена в виде распределенной транзакции с помощью BEGIN DISTRIBUTED TRANSACTION. Дополнительные сведения см. в разделе BEGIN DISTRIBUTED TRANSACTION.
Если SET IMPLICIT_TRANSACTIONS задано ONзначение, BEGIN TRANSACTION оператор создает внешнюю и внутреннюю транзакцию, установив значение @@TRANCOUNT 2. Дополнительные сведения см. в разделе SET IMPLICIT_TRANSACTIONS (Transact-SQL).
Замечание
Ядро СУБД не поддерживает независимо управляемые вложенные транзакции. Фиксация внутренних транзакций уменьшается @@TRANCOUNT , но не имеет других последствий. Откат внутренней транзакции всегда откатывает внешнюю транзакцию, если точка сохранения не существует и не указана в инструкции ROLLBACK .
Помеченные транзакции
Параметр 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 column1 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 Azure, база данных SQL в Microsoft Fabric, Azure Synapse Analytics, платформа аналитики (PDW)
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
B. Откат транзакции
Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric, 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 Azure, база данных SQL в Microsoft Fabric
В следующем примере показано, как присвоить транзакции имя.
DECLARE @TranName AS VARCHAR (20);
SELECT @TranName = 'MyTransaction';
BEGIN TRANSACTION @TranName;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION @TranName;
D. Пометить транзакцию
Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric
В следующем примере показано, как пометить транзакцию. Транзакция CandidateDelete помечена.
BEGIN TRANSACTION CandidateDelete
WITH MARK N'Deleting a Job Candidate';
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION CandidateDelete;