Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server
База данных
SQL AzureУправляемый экземпляр
SQL AzureAzure Synapse Analytics
Система платформы аналитики (PDW)
Хранилище в Microsoft Fabric
База данных SQL в Microsoft Fabric
Отмечает успешное завершение явной или неявной транзакции.
Если @@TRANCOUNT значение равно 1, выполняет все изменения данных с момента начала транзакции постоянной частью базы данных, COMMIT TRANSACTION освобождает ресурсы транзакции и уменьшается @@TRANCOUNT до 0.
Если @@TRANCOUNT значение больше 1, уменьшение @@TRANCOUNT на 1, COMMIT TRANSACTION а транзакция остается активной.
Соглашения о синтаксисе Transact-SQL
Syntax
Синтаксис ДЛЯ SQL Server, Базы данных SQL Azure, Управляемого экземпляра SQL Azure, базы данных SQL в Microsoft Fabric.
COMMIT [ { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable ] ]
[ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]
Синтаксис для хранилища данных Fabric, Azure Synapse Analytics и базы данных параллельного хранилища данных.
COMMIT [ TRAN | TRANSACTION ]
[ ; ]
Arguments
transaction_name
Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.
Игнорируется ядром СУБД при указании с COMMITпомощью .
transaction_name указывает имя транзакции, назначенное предыдущимBEGIN TRANSACTION.
transaction_name должны соответствовать правилам идентификаторов, но не может превышать 32 символов.
transaction_name можно использовать в качестве метода документации по коду, чтобы указать, с какой из внутренних BEGIN TRANSACTIONCOMMIT TRANSACTION инструкций связан оператор.
@tran_name_variable
Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.
Имя определяемой пользователем переменной, содержащей допустимое имя транзакции. Переменная должна быть объявлена с типом данных char, varchar, nchar или nvarchar. Если в переменную передаются более 32 символов, используются только первые 32 символа. Остальные символы усечены.
С DELAYED_DURABILITY = { OFF | ON }
Область применения: SQL Server 2008 (10.0.x) и более поздних версий, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.
Параметр, запрашивающий фиксацию этой транзакции с задержкой устойчивости. Запрос игнорируется, если задержка устойчивости отключена для базы данных. Транзакция фиксируется с задержкой устойчивости независимо от этого параметра, если задержка устойчивости принудительно выполняется для базы данных.
Дополнительные сведения см. в разделе Управление устойчивостью транзакций.
Remarks
Это ответственность за выполнение приложения в момент, когда все данные, на которые ссылается COMMIT TRANSACTION транзакция, достигают предполагаемого состояния согласованности.
Если транзакция зафиксирована была Transact-SQL распределенной транзакцией, COMMIT TRANSACTION активирует MS DTC для использования протокола двухфазной фиксации для фиксации транзакции на всех серверах, участвующих в транзакции. Если локальная транзакция охватывает две или несколько баз данных в одном экземпляре ядра СУБД, экземпляр использует внутреннюю двухфазную фиксацию для фиксации транзакции во всех базах данных, участвующих в транзакции.
При использовании для внутренних транзакций фиксация не освобождает ресурсы или постоянно изменяет данные. Изменения данных становятся постоянными, а ресурсы освобождаются только при фиксации внешней транзакции. Каждый COMMIT TRANSACTION выдается, когда @@TRANCOUNT больше 1 декрементов @@TRANCOUNT на 1, но не имеет других последствий. Когда @@TRANCOUNT окончательно уменьшается до 0, все внешние транзакции фиксируются. Так как transaction_name , указанный с помощью COMMIT TRANSACTION ядра СУБД, выдает ссылку на имя внешней транзакции при COMMIT TRANSACTION наличии невыполненных внутренних @@TRANCOUNT транзакций только на 1.
При выполнении нулевого COMMIT TRANSACTION@@TRANCOUNT значения ошибка возникает из-за отсутствия соответствующего BEGIN TRANSACTIONзначения.
Вы не можете откатить транзакцию после COMMIT TRANSACTION выдачи инструкции, так как изменения данных уже являются постоянной частью базы данных.
Замечание
Ядро СУБД не поддерживает независимо управляемые вложенные транзакции. Фиксация внутренних транзакций уменьшается @@TRANCOUNT , но не имеет других последствий. Откат внутренней транзакции всегда откатывает внешнюю транзакцию, если точка сохранения не существует и не указана в инструкции ROLLBACK .
Permissions
Необходимо членство в роли public.
Examples
Примеры кода в этой статье используют базу данных образца AdventureWorks2025 или AdventureWorksDW2025, которую можно скачать с домашней страницы образцов и проектов сообщества Microsoft SQL Server и.
A. Фиксация транзакции
Область применения: SQL Server, База данных 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, База данных SQL Azure, Управляемый экземпляр SQL Azure, база данных SQL в Microsoft Fabric.
В следующем примере создается таблица, запускается внешняя и две внутренние транзакции, а затем фиксируется каждая транзакция.
Параметры 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));
Связанный контент
- НАЧАТЬ РАСПРЕДЕЛЕННУЮ ТРАНЗАКЦИЮ (Transact-SQL)
- НАЧАЛО ТРАНЗАКЦИИ (Transact-SQL)
- ОБЯЗАТЕЛЬНАЯ РАБОТА (Transact-SQL)
- ТРАНЗАКЦИЯ ОТКАТА (Transact-SQL)
- РАБОТА ПО ОТКАТУ (Transact-SQL)
- СОХРАНИТЬ ТРАНЗАКЦИЮ (Transact-SQL)
- @@TRANCOUNT (Transact-SQL)
- Руководство по блокировке и управлению версиями строк транзакций