COMMIT TRANSACTION (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure хранилище платформы Аналитики Azure Synapse Analytics (PDW) в Microsoft Fabric
Отмечает успешное завершение явной или неявной транзакции. Если @@TRANCOUNT
значение равно 1, COMMIT TRANSACTION
выполняет все изменения данных с момента начала транзакции постоянной частью базы данных, освобождает ресурсы транзакции и уменьшается @@TRANCOUNT
до 0. Если @@TRANCOUNT
значение больше 1, уменьшается @@TRANCOUNT
только на 1, COMMIT TRANSACTION
а транзакция остается активной.
Соглашения о синтаксисе Transact-SQL
Синтаксис
Синтаксис ДЛЯ SQL Server и База данных SQL Azure.
COMMIT [ { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable ] ]
[ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]
Синтаксис для хранилища данных Synapse в Microsoft Fabric, Azure Synapse Analytics и базе данных параллельного хранилища данных.
COMMIT [ TRAN | TRANSACTION ]
[ ; ]
Аргументы
transaction_name
Область применения: SQL Server и База данных SQL Azure
Игнорируется ядро СУБД SQL Server. transaction_name указывает имя транзакции, назначенное предыдущимBEGIN TRANSACTION
. Аргумент transaction_name должен соответствовать правилам для идентификаторов, но его длина не может превышать 32 символа. transaction_name указывает программистам, с которым BEGIN TRANSACTION
COMMIT TRANSACTION
связано вложение.
@tran_name_variable
Область применения: SQL Server и База данных SQL Azure
Имя определяемой пользователем переменной, содержащей допустимое имя транзакции. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar. Если в переменную передаются более 32 символов, используются только 32 символа. Остальные символы усечены.
WITH DELAYED_DURABILITY = { OFF | ON }
Область применения: SQL Server и База данных SQL Azure
Параметр, который запрашивает эту транзакцию, должен фиксироваться с задержанной устойчивостью. Запрос игнорируется, если база данных была изменена или DELAYED_DURABILITY = DISABLED
DELAYED_DURABILITY = FORCED
. Дополнительные сведения см. в разделе Управление устойчивостью транзакций.
Замечания
Это ответственность программиста Transact-SQL выдавать COMMIT TRANSACTION
только в момент, когда все данные, на которые ссылается транзакция, логически правильны.
Если транзакция зафиксирована была распределенной транзакцией Transact-SQL, COMMIT TRANSACTION
активирует MS DTC для использования протокола двухэтапной фиксации для фиксации всех серверов, участвующих в транзакции. Если локальная транзакция охватывает две или несколько баз данных в одном экземпляре ядро СУБД, экземпляр использует внутреннюю двухфазную фиксацию для фиксации всех баз данных, участвующих в транзакции.
При использовании вложенных транзакций фиксация внутренних транзакций не освобождает ресурсы и не делает их изменения постоянными. Изменения данных становятся постоянными и ресурсы освобождаются только при фиксации внешней транзакции. Каждый COMMIT TRANSACTION
выдается, когда @@TRANCOUNT
больше одного просто уменьшается @@TRANCOUNT
на 1. Когда @@TRANCOUNT
окончательно уменьшается до 0, все внешние транзакции фиксируются. Так как transaction_name игнорируется ядро СУБД, выдав COMMIT TRANSACTION
ссылку на имя внешней транзакции, если есть невыполненные внутренние транзакции только на @@TRANCOUNT
1.
COMMIT TRANSACTION
@@TRANCOUNT
При выполнении ноль приводит к ошибке; соответствующая BEGIN TRANSACTION
ошибка отсутствует.
Вы не можете откатить транзакцию после COMMIT TRANSACTION
выдачи инструкции, так как изменения данных были сделаны постоянной частью базы данных.
Ядро СУБД увеличивает число транзакций в операторе, только если число транзакций равно 0 в начале инструкции.
Разрешения
Необходимо быть членом роли public.
Примеры
Примеры кода Transact-SQL в этой статье используют AdventureWorks2022
базу данных или AdventureWorksDW2022
пример базы данных, которую можно скачать с домашней страницы примеров и проектов сообщества Microsoft SQL Server.
А. Фиксация транзакции
Область применения: SQL Server, База данных SQL Azure, Azure Synapse Analytics и Analytics Platform System (PDW)
В следующем примере удаляется кандидат на вакансию.
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
B. Фиксация вложенной транзакции
Область применения: SQL Server и База данных SQL Azure
В следующем примере создается таблица и формируется три уровня вложенных транзакций, которые затем фиксируются. Хотя каждая инструкция COMMIT TRANSACTION
имеет параметр transaction_name, связи между инструкциями COMMIT TRANSACTION
и BEGIN TRANSACTION
не существует. Параметры transaction_name позволяют программисту удостовериться в том, что закодировано правильное количество фиксаций, необходимое для того, чтобы уменьшить значение @@TRANCOUNT
до 0 и таким образом зафиксировать внешнюю транзакцию.
IF OBJECT_ID(N'TestTran', N'U') IS NOT NULL
DROP TABLE TestTran;
GO
CREATE TABLE TestTran (
Cola INT PRIMARY KEY,
Colb CHAR(3)
);
GO
-- This statement sets @@TRANCOUNT to 1.
BEGIN TRANSACTION OuterTran;
PRINT N'Transaction count after BEGIN OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO TestTran
VALUES (1, 'aaa');
-- This statement sets @@TRANCOUNT to 2.
BEGIN TRANSACTION Inner1;
PRINT N'Transaction count after BEGIN Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO TestTran
VALUES (2, 'bbb');
-- This statement sets @@TRANCOUNT to 3.
BEGIN TRANSACTION Inner2;
PRINT N'Transaction count after BEGIN Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
INSERT INTO TestTran
VALUES (3, 'ccc');
-- This statement decrements @@TRANCOUNT to 2.
-- Nothing is committed.
COMMIT TRANSACTION Inner2;
PRINT N'Transaction count after COMMIT Inner2 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
-- This statement decrements @@TRANCOUNT to 1.
-- Nothing is committed.
COMMIT TRANSACTION Inner1;
PRINT N'Transaction count after COMMIT Inner1 = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));
-- This statement decrements @@TRANCOUNT to 0 and
-- commits outer transaction OuterTran.
COMMIT TRANSACTION OuterTran;
PRINT N'Transaction count after COMMIT OuterTran = ' + CAST(@@TRANCOUNT AS NVARCHAR(10));