BEGIN TRANSACTION (Transact-SQL)
Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)Warehouse in 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 }
[ ; ]
Примечание.
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
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
Связанный контент
Кері байланыс
https://aka.ms/ContentUserFeedback.
Жақында қолжетімді болады: 2024 жыл бойы біз GitHub Issues жүйесін мазмұнға арналған кері байланыс механизмі ретінде біртіндеп қолданыстан шығарамыз және оны жаңа кері байланыс жүйесімен ауыстырамыз. Қосымша ақпаратты мұнда қараңыз:Жіберу және пікірді көру