隱式事務

這裏講講SqlServer的隱式事務。(英文Implicit:含蓄的;暗示的;盲從的;)sql

隱式事務無需顯示開始:不用 Begin Transaction,必須顯示結束:以 Commit Transaction 或者 Rollback Transaction 方式結束。spa

語句迭代迭代:SET IMPLICIT_TRANSACTIONS { ON | OFF }code

開了隱式事務後,下面的語句的語句就會自動開啓隱式事務。server

使用

要想知道當前有多少事務沒有結束:@@TranCountblog

舉例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。ci

--設置隱式事務爲關閉,其實默認就是關的.
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:get

--設置隱式事務開啓
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).it

參考官網:https://docs.microsoft.com/en-us/sql/t-sql/statements/set-implicit-transactions-transact-sql?view=sql-server-2017io

相關文章
相關標籤/搜索