COMMIT TRANSACTION (Transact-SQL)
Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)Warehouse in 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 ]
[ ; ]
Примечание.
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
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.
Примеры
В этой статье требуется AdventureWorks2022
пример базы данных, которую можно скачать на домашней странице примеров и проектов сообщества 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));
Связанный контент
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по