這裡講講SqlServer的隱式事務。(英文Implicit:含蓄的;暗示的;盲從的;) 隱式事務無需顯示開始:不用 Begin Transaction,必須顯示結束:以 Commit Transaction 或者 Rollback Transaction 方式結束。 語句迭代迭代:SET IMPL ...
這裡講講SqlServer的隱式事務。(英文Implicit:含蓄的;暗示的;盲從的;)
隱式事務無需顯示開始:不用 Begin Transaction,必須顯示結束:以 Commit Transaction 或者 Rollback Transaction 方式結束。
語句迭代迭代:SET IMPLICIT_TRANSACTIONS { ON | OFF }
開了隱式事務後,下麵的語句的語句就會自動開啟隱式事務。
使用
要想知道當前有多少事務沒有結束:@@TranCount 。
舉例1:設置隱式事務關閉,雖然預設是關的。剩下多少事務沒有結束。
--創建一個表 go IF (OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL) DROP TABLE dbo.t1; go CREATE table dbo.t1 (a int); go --設置隱式事務為關閉,其實預設就是關的. SET IMPLICIT_TRANSACTIONS OFF; --插入兩條數據 INSERT INTO dbo.t1 VALUES (11); INSERT INTO dbo.t1 VALUES (12); --查看有多少條事務沒有結束 PRINT N' @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10)); --結果 @@TranCount, after INSERTs, == 0
如果不開啟隱式事務,事務結束都是自動的。除非用 Begin Transaction。
--設置隱式事務為關閉,其實預設就是關的. SET IMPLICIT_TRANSACTIONS OFF; --開始事務 BEGIN TRANSACTION; --插入兩條數據 INSERT INTO dbo.t1 VALUES (11); INSERT INTO dbo.t1 VALUES (12); --查看有多少條數據沒有關閉 PRINT N'@@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10)); --結果 @@TranCount, after INSERTs, == 1 --結束事務 COMMIT TRANSACTION; --查看有多少條數據沒有關閉 PRINT N' @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10)); --結果 @@TranCount, after INSERTs, == 0
舉例2:
--設置隱式事務開啟 SET IMPLICIT_TRANSACTIONS ON; --插入兩條 刪除一條 INSERT INTO dbo.t1 VALUES (21); INSERT INTO dbo.t1 VALUES (22); delete from dbo.t1 PRINT N'[B.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10)); --提交一個事務 COMMIT TRANSACTION; PRINT N'[B.04] @@TranCount, after COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10)); go --結果 --[B.03] @@TranCount, after INSERTs, == 1 --[B.04] @@TranCount, after COMMIT, == 0
SET IMPLICIT_TRANSACTIONS ON; go --開啟事務 BEGIN TRANSACTION; --進行添加 刪除操作 INSERT INTO dbo.t1 VALUES (31); INSERT INTO dbo.t1 VALUES (32); delete from dbo.t1 PRINT N'[C.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10)); go --提交事務 COMMIT TRANSACTION; PRINT N'[C.04] @@TranCount, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10)); --提交事務 COMMIT TRANSACTION; PRINT N'[C.05] @@TranCount, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10)); go --[C.03] @@TranCount, after INSERTs, == 2 --[C.04] @@TranCount, after a COMMIT, == 1 --[C.05] @@TranCount, after another COMMIT, == 0
隱式事務不怎麼用,除非 SET ANSI_DEFAULTS (Transact-SQL).