BEGIN TRANSACTION (Transact-SQL)BEGIN TRANSACTION (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure даAzure Synapse Analytics (хранилище данных SQL) даParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) yesParallel Data Warehouse

Отмечает начальную точку явной локальной транзакции.Marks the starting point of an explicit, local transaction. Явные транзакции начинаются с инструкции BEGIN TRANSACTION и заканчиваются инструкцией COMMIT или ROLLBACK.Explicit transactions start with the BEGIN TRANSACTION statement and end with the COMMIT or ROLLBACK statement.

Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

--Applies to SQL Server and Azure SQL Database
 
BEGIN { TRAN | TRANSACTION }   
    [ { transaction_name | @tran_name_variable }  
      [ WITH MARK [ 'description' ] ]  
    ]  
[ ; ]  
--Applies to Azure SQL Data Warehouse and Parallel Data Warehouse
 
BEGIN { TRAN | TRANSACTION }   
[ ; ]  

АргументыArguments

transaction_nametransaction_name
ПРИМЕНИМО К: SQL Server (начиная с версии 2008), база данных SQL AzureAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Имя, присвоенное транзакции.Is the name assigned to the transaction. Аргумент transaction_name должен соответствовать правилам для идентификаторов, однако не допускаются идентификаторы длиннее 32 символов.transaction_name must conform to the rules for identifiers, but identifiers longer than 32 characters are not allowed. Имена транзакций используются только для самых внешних вложенных инструкций BEGIN...COMMIT или BEGIN...ROLLBACK.Use transaction names only on the outermost pair of nested BEGIN...COMMIT or BEGIN...ROLLBACK statements. Аргумент transaction_name всегда учитывает регистр, даже если экземпляр SQL ServerSQL Server регистр не учитывает.transaction_name is always case sensitive, even when the instance of SQL ServerSQL Server is not case sensitive.

@tran_name_variable@tran_name_variable
ПРИМЕНИМО К: SQL Server (начиная с версии 2008), база данных SQL AzureAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Имя определенной пользователем переменной, содержащей допустимое имя транзакции.Is the name of a user-defined variable containing a valid transaction name. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar.The variable must be declared with a char, varchar, nchar, or nvarchar data type. Если переменной передается больше 32 символов, используются только 32 первых символа, а остальные усекаются.If more than 32 characters are passed to the variable, only the first 32 characters will be used; the remaining characters will be truncated.

WITH MARK [ 'description' ]WITH MARK [ 'description' ]
ПРИМЕНИМО К: SQL Server (начиная с версии 2008), база данных SQL AzureAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

Указывает, что транзакция отмечается в журнале.Specifies that the transaction is marked in the log. Значение аргумента description — это строка, описывающая отметку.description is a string that describes the mark. Значения аргумента description длиннее 128 символов усекаются до 128 символов перед сохранением в таблице msdb.dbo.logmarkhistory.A description longer than 128 characters is truncated to 128 characters before being stored in the msdb.dbo.logmarkhistory table.

Если используется предложение WITH MARK, необходимо указать имя транзакции.If WITH MARK is used, a transaction name must be specified. Предложение WITH MARK позволяет восстановить журнал транзакций до именованной отметки.WITH MARK allows for restoring a transaction log to a named mark.

Общие замечанияGeneral Remarks

Инструкция BEGIN TRANSACTION увеличивает значение @@TRANCOUNT на 1.BEGIN TRANSACTION increments @@TRANCOUNT by 1.

Инструкция BEGIN TRANSACTION предоставляет точку, где гарантируется логическая и физическая согласованность данных, на которые ссылается соединение.BEGIN TRANSACTION represents a point at which the data referenced by a connection is logically and physically consistent. При возникновении ошибок все изменения, внесенные в данные после выполнения инструкции BEGIN TRANSACTION, можно откатить, чтобы вернуть данные в известное согласованное состояние.If errors are encountered, all data modifications made after the BEGIN TRANSACTION can be rolled back to return the data to this known state of consistency. Каждая транзакция продолжается до тех пор, пока она не завершается без ошибок и выполняется инструкция COMMIT TRANSACTION, чтобы внести изменения в базу данных. В случае возникновения ошибок все изменения удаляются с помощью инструкции ROLLBACK TRANSACTION.Each transaction lasts until either it completes without errors and COMMIT TRANSACTION is issued to make the modifications a permanent part of the database, or errors are encountered and all modifications are erased with a ROLLBACK TRANSACTION statement.

Инструкция BEGIN TRANSACTION запускает локальную транзакцию для соединения, выполняющего эту инструкцию.BEGIN TRANSACTION starts a local transaction for the connection issuing the statement. В зависимости от текущих параметров уровня изоляции транзакции многие ресурсы, необходимые для поддержки выполняемых соединением инструкций языка Transact-SQLTransact-SQL, блокируются транзакцией до ее завершения с помощью инструкций COMMIT TRANSACTION и ROLLBACK TRANSACTION.Depending on the current transaction isolation level settings, many resources acquired to support the Transact-SQLTransact-SQL statements issued by the connection are locked by the transaction until it is completed with either a COMMIT TRANSACTION or ROLLBACK TRANSACTION statement. Транзакции, долгое время ожидающие обработки, могут препятствовать доступу других пользователей к заблокированным ресурсам и усечения транзакций в журнале.Transactions left outstanding for long periods of time can prevent other users from accessing these locked resources, and also can prevent log truncation.

Хотя инструкция BEGIN TRANSACTION запускает локальную транзакцию, она не записывается в журнал транзакций, пока приложение не выполнит действие, которое должно быть записано в журнал, например инструкцию INSERT, UPDATE или DELETE.Although BEGIN TRANSACTION starts a local transaction, it is not recorded in the transaction log until the application subsequently performs an action that must be recorded in the log, such as executing an INSERT, UPDATE, or DELETE statement. Приложение может выполнять такие действия, как получение блокировки для защиты уровня изоляции транзакции инструкции SELECT, но ни одно действие не записывается в журнал, пока приложение не выполнит действие, изменяющее данные.An application can perform actions such as acquiring locks to protect the transaction isolation level of SELECT statements, but nothing is recorded in the log until the application performs a modification action.

Присвоение имен нескольким транзакциям в последовательности вложенных транзакций мало влияет на транзакцию.Naming multiple transactions in a series of nested transactions with a transaction name has little effect on the transaction. Системой регистрируется только первое (самое внешнее) имя транзакции.Only the first (outermost) transaction name is registered with the system. Откат к другому имени (не считая допустимого имени точки сохранения) приводит к формированию ошибки.A rollback to any other name (other than a valid savepoint name) generates an error. В момент возникновения такой ошибки на самом деле не выполняется откат инструкций.None of the statements executed before the rollback is, in fact, rolled back at the time this error occurs. Для этих инструкций выполняется откат только при откате внешней транзакции.The statements are rolled back only when the outer transaction is rolled back.

Локальная транзакция, запущенная инструкцией BEGIN TRANSACTION, повышается до распределенной транзакции, если до фиксации или отката инструкции выполняются следующие действия.The local transaction started by the BEGIN TRANSACTION statement is escalated to a distributed transaction if the following actions are performed before the statement is committed or rolled back:

  • Выполняется инструкция INSERT, DELETE или UPDATE, ссылающаяся на удаленную таблицу или связанный сервер.An INSERT, DELETE, or UPDATE statement that references a remote table on a linked server is executed. Инструкция INSERT, UPDATE или DELETE завершается неудачно, если поставщик OLE DB, который используется для доступа к связанному серверу, не поддерживает интерфейс ITransactionJoin.The INSERT, UPDATE, or DELETE statement fails if the OLE DB provider used to access the linked server does not support the ITransactionJoin interface.

  • Вызывается удаленная хранимая процедура, если для параметра REMOTE_PROC_TRANSACTIONS установлено значение ON.A call is made to a remote stored procedure when the REMOTE_PROC_TRANSACTIONS option is set to ON.

Локальная копия SQL ServerSQL Server становится контроллером транзакции и использует координатор распределенных транзакций MicrosoftMicrosoft (MS DTC) для управления распределенной транзакцией.The local copy of SQL ServerSQL Server becomes the transaction controller and uses MicrosoftMicrosoft Distributed Transaction Coordinator (MS DTC) to manage the distributed transaction.

Транзакция может выполняться явно как распределенная с помощью инструкции BEGIN DISTRIBUTED TRANSACTION.A transaction can be explicitly executed as a distributed transaction by using BEGIN DISTRIBUTED TRANSACTION. Дополнительные сведения см. в статье BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).For more information, see BEGIN DISTRIBUTED TRANSACTION (Transact-SQL).

Если SET IMPLICIT_TRANSACTIONS задано как ON, то инструкция BEGIN TRANSACTION создает две вложенные транзакции.When SET IMPLICIT_TRANSACTIONS is set to ON, a BEGIN TRANSACTION statement creates two nested transactions. Дополнительные сведения см. в статье SET IMPLICIT_TRANSACTIONS (Transact-SQL).For more information see, SET IMPLICIT_TRANSACTIONS (Transact-SQL)

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

Если используется параметр WITH MARK, имя транзакции помещается в журнал транзакций.The WITH MARK option causes the transaction name to be placed in the transaction log. При восстановлении базы данных из копии до прежнего состояния вместо даты и времени может использоваться помеченная транзакция.When restoring a database to an earlier state, the marked transaction can be used in place of a date and time. Дополнительные сведения см. в статьях Использование помеченных транзакций для согласованного восстановления связанных баз данных (модель полного восстановления) и RESTORE (Transact-SQL).For more information, see Use Marked Transactions to Recover Related Databases Consistently (Full Recovery Model) and RESTORE (Transact-SQL).

Кроме того, отметки в журнале транзакций необходимы, если нужно восстановить набор взаимосвязанных баз данных до логически согласованного состояния.Additionally, transaction log marks are necessary if you need to recover a set of related databases to a logically consistent state. Отметки можно записывать в журналы транзакций взаимосвязанных баз данных с помощью распределенной транзакции.Marks can be placed in the transaction logs of the related databases by a distributed transaction. Восстановление набора взаимосвязанных баз данных по журналу до этих отметок приводит к транзакционной согласованности этого набора баз данных.Recovering the set of related databases to these marks results in a set of databases that are transactionally consistent. Размещение отметок в связанных базах данных требует использования специальных процедур.Placement of marks in related databases requires special procedures.

Отметка записывается в журнал транзакций только в том случае, если база данных обновляется помеченной транзакцией.The mark is placed in the transaction log only if the database is updated by the marked transaction. Транзакции, не изменяющие данные, не отмечаются.Transactions that do not modify data are not marked.

Инструкцию BEGIN TRAN new_name WITH MARK можно вложить в уже существующую непомеченную транзакцию.BEGIN TRAN new_name WITH MARK can be nested within an already existing transaction that is not marked. При этом значением параметра new_name становится имя метки транзакции несмотря на то, что транзакция может иметь имя.Upon doing so, new_name becomes the mark name for the transaction, despite the name that the transaction may already have been given. В следующем примере M2 является именем метки.In the following example, M2 is the name of the mark.

BEGIN TRAN T1;  
UPDATE table1 ...;  
BEGIN TRAN M2 WITH MARK;  
UPDATE table2 ...;  
SELECT * from table1;  
COMMIT TRAN M2;  
UPDATE table3 ...;  
COMMIT TRAN T1;  

При существовании вложенности транзакций попытка отметить транзакцию, уже имеющую метку, приводит к следующему предупреждению (не ошибке):When nesting transactions, trying to mark a transaction that is already marked results in a warning (not error) message:

BEGIN TRAN T1 WITH MARK ...;"BEGIN TRAN T1 WITH MARK ...;"

UPDATE table1 ...;"UPDATE table1 ...;"

BEGIN TRAN M2 WITH MARK ...;"BEGIN TRAN M2 WITH MARK ...;"

"Сервер: сообщение 3920, уровень 16, состояние 1, строка 3""Server: Msg 3920, Level 16, State 1, Line 3"

«Параметр WITH MARK применяется только к первой инструкции BEGIN TRAN WITH MARK.»"WITH MARK option only applies to the first BEGIN TRAN WITH MARK."

«Параметр не обрабатывается.»"The option is ignored."

РазрешенияPermissions

Требуется членство в роли public.Requires membership in the public role.

ПримерыExamples

A.A. Использование явной транзакцииUsing an explicit transaction

ПРИМЕНИМО К: SQL Server (начиная с версии 2008), база данных SQL Azure, хранилище данных SQL Azure, Parallel Data WarehouseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse

В примере используется база данных AdventureWorks.This example uses AdventureWorks.

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

Б.B. Откат транзакцииRolling back a transaction

ПРИМЕНИМО К: SQL Server (начиная с версии 2008), база данных SQL Azure, хранилище данных SQL Azure, Parallel Data WarehouseAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse

В приведенном ниже примере демонстрируется результат отката транзакции.The following example shows the effect of rolling back a transaction. В этом примере инструкция ROLLBACK приведет к откату инструкции INSERT, но созданная таблица будет по-прежнему существовать.In this example, the ROLLBACK statement will roll back the INSERT statement, but the created table will still exist.

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

В.C. Присвоение транзакции имениNaming a transaction

ПРИМЕНИМО К: SQL Server (начиная с версии 2008), база данных SQL AzureAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

В следующем примере показано, как присвоить транзакции имя.The following example shows how to name a transaction.

DECLARE @TranName VARCHAR(20);  
SELECT @TranName = 'MyTransaction';  
  
BEGIN TRANSACTION @TranName;  
USE AdventureWorks2012;  
DELETE FROM AdventureWorks2012.HumanResources.JobCandidate  
    WHERE JobCandidateID = 13;  
  
COMMIT TRANSACTION @TranName;  
GO  

Г.D. Пометка транзакцииMarking a transaction

ПРИМЕНИМО К: SQL Server (начиная с версии 2008), база данных SQL AzureAPPLIES TO: SQL Server (starting with 2008), Azure SQL Database

В следующем примере показано, как пометить транзакцию.The following example shows how to mark a transaction. Транзакция CandidateDelete помечена.The transaction CandidateDelete is marked.

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

См. также:See Also

BEGIN DISTRIBUTED TRANSACTION (Transact-SQL) BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)
COMMIT TRANSACTION (Transact-SQL) COMMIT TRANSACTION (Transact-SQL)
COMMIT WORK (Transact-SQL) COMMIT WORK (Transact-SQL)
ROLLBACK TRANSACTION (Transact-SQL) ROLLBACK TRANSACTION (Transact-SQL)
ROLLBACK WORK (Transact-SQL) ROLLBACK WORK (Transact-SQL)
SAVE TRANSACTION (Transact-SQL)SAVE TRANSACTION (Transact-SQL)