COMMIT TRANSACTION (Transact-SQL)
適用於:sql Server Azure SQL 資料庫 Azure SQL 受控執行個體 azure Synapse Analytics Platform System (PDW) warehouse in Microsoft Fabric SQL database in Microsoft Fabric
標示順利完成的隱含或明確的交易結束。 如果 @@TRANCOUNT
為 1, COMMIT TRANSACTION
則會在交易開始後進行所有數據修改,成為資料庫的永久部分、釋放交易的資源,並將遞減 @@TRANCOUNT
為 0。 當 @@TRANCOUNT
大於 1 時, COMMIT TRANSACTION
只會遞減 @@TRANCOUNT
1,且交易會保持作用中。
Syntax
SQL Server 和 Azure SQL Database 的語法。
COMMIT [ { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable ] ]
[ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]
Microsoft Fabric、Azure Synapse Analytics 和平行處理數據倉儲資料庫中 Synapse 數據倉儲的語法。
COMMIT [ TRAN | TRANSACTION ]
[ ; ]
引數
transaction_name
適用於:SQL Server 和 Azure SQL Database
SQL Server 資料庫引擎 忽略。 transaction_name指定先前 BEGIN TRANSACTION
指派的交易名稱。 transaction_name 必須符合識別碼規則,但不能超過 32 個字元。 transaction_name會向巢狀BEGIN TRANSACTION
COMMIT TRANSACTION
的程式設計人員指出與其建立關聯的 。
@tran_name_variable
適用於:SQL Server 和 Azure SQL Database
包含有效交易名稱的使用者定義變數名稱。 這個變數必須用 char、varchar、nchar 或 nvarchar 資料類型來宣告。 如果將超過 32 個字元傳遞至變數,則只會使用 32 個字元。 其餘字元會被截斷。
WITH DELAYED_DURABILITY = { OFF |ON }
適用於:SQL Server 和 Azure SQL Database
要求這筆交易應延遲持久性認可的選項。 如果使用 或DELAYED_DURABILITY = FORCED
更改DELAYED_DURABILITY = DISABLED
資料庫,則會忽略要求。 如需詳細資訊,請參閱控制交易持久性。
備註
只有在交易所參考的所有數據都符合邏輯正確時,Transact-SQL 程式設計人員才有責任發出 COMMIT TRANSACTION
問題。
如果認可的交易是 Transact-SQL 分散式交易, COMMIT TRANSACTION
則觸發 MS DTC 使用雙階段認可通訊協議來認可交易所涉及的所有伺服器。 當本機交易跨越相同資料庫引擎執行個體的兩個或更多資料庫時,執行個體會利用內部的兩階段交易認可,認可與交易有關的所有資料庫。
用於巢狀交易時,認可內部交易並不會釋出資源,或永久修改它們。 只有在認可外部交易時,才會使資料修改永久化及釋出資源。 當大於 1 時所發出的@@TRANCOUNT
每COMMIT TRANSACTION
一個只會遞減 @@TRANCOUNT
1。 當 最後遞減至 0 時 @@TRANCOUNT
,會認可整個外部交易。 因為 資料庫引擎 會忽略transaction_name,因此當有未完成的內部交易只會遞減 @@TRANCOUNT
1 時,發出COMMIT TRANSACTION
參考外部交易的名稱。
COMMIT TRANSACTION
@@TRANCOUNT
當為零時發出 會導致錯誤;沒有對應的 BEGIN TRANSACTION
。
您無法在發出語句之後 COMMIT TRANSACTION
回復交易,因為數據修改已成為資料庫的永久部分。
只有在陳述式開頭的交易計數是 0 時,資料庫引擎才會在陳述式內增加交易。
權限
需要 public 角色的成員資格。
範例
本文 Transact-SQL 程式碼範例使用 AdventureWorks2022
或 AdventureWorksDW2022
範例資料庫,從 Microsoft SQL Server Samples 和 Community Projects (Microsoft SQL Server 範例和社群專案)首頁即可下載。
A. 認可交易
適用於:SQL Server、Azure SQL Database、Azure Synapse Analytics 和 Analytics Platform System (PDW)
下列範例會刪除作業候選項。
BEGIN TRANSACTION;
DELETE FROM HumanResources.JobCandidate
WHERE JobCandidateID = 13;
COMMIT TRANSACTION;
B. 認可巢狀交易
適用於:SQL Server 和 Azure SQL Database
此範例會建立一份資料表,並產生三個層級的巢狀交易,再認可巢狀交易。 雖然每個 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));