SQLServer之建立隱式事務
隱式事務建立注意事項
IMPLICIT_TRANSACTIONS為 ON 時,系統處於“隱式”事務模式。 這意味著如果 @@TRANCOUNT = 0,下列任一 Transact-SQL 語句都會開始新事務。 這等同於先執行一個不可見的 BEGIN TRANSACTION。
IMPLICIT_TRANSACTIONS為 OFF 時,上述每個 T-SQL 語句都受一個不可見的 BEGIN TRANSACTION 和一個不可見的 COMMIT TRANSACTION 語句限制。為 OFF 時,事務模式為自動提交。 如果 T-SQL 程式碼發出了一個可見 BEGIN TRANSACTION,那麼事務模式為顯式。
有幾點需要說明:
-
事務模式為隱式時,如果 @@trancount > 0,則不會發出不可見的 BEGIN TRANSACTION。 但是,任何顯式 BEGIN TRANSACTION 語句都會遞增 @@TRANCOUNT。
-
INSERT 語句和工作單元中的其他任務完成後,鬚髮出 COMMIT TRANSACTION 語句,直到 @@TRANCOUNT 遞減為 0。 也可以發出一個 ROLLBACK TRANSACTION。
-
不會從表中選擇的 SELECT 語句不會啟動隱式事務。 例如,
SELECT GETDATE();
或SELECT 1, 'ABC';
-
由於 ANSI 預設值的原因,可能會意外開啟隱式事務。 有關詳細資訊,請參閱 SET ANSI_DEFAULTS (Transact-SQL).
IMPLICIT_TRANSACTIONS ON 不常用。 大多數情況下,IMPLICIT_TRANSACTIONS 為 ON,是因為選擇了 SET ANSI_DEFAULTS ON。
-
進行連線時, SQL Server Native Client OLE DB Provider for SQL Server 和 SQL Server Native Client ODBC 驅動程式會自動將 IMPLICIT_TRANSACTIONS 設定為 OFF。 對於與 SQLClient 託管提供程式進行連線,及通過 HTTP 端點接收的 SOAP 請求,SET IMPLICIT_TRANSACTIONS 預設為 OFF。
使用T-SQL指令碼建立隱式事務
語法:
--宣告資料庫引用
use 資料庫名稱;
go
--設定隱式事務開關
set implicit_transactions { on | off };
--事務業務邏輯
事務操作內容;
--檢視是否有事務開啟
select @@trancount;
--必須提交或者回滾事務
{ commit | rollback } { tran | transaction};
語法解析:
--set implicit_transactions { on | off };
--為 ON 時,系統處於“隱式”事務模式。 這意味著如果 @@TRANCOUNT = 0
--為 OFF 時,上述每個 T-SQL 語句都受一個不可見的 BEGIN TRANSACTION 和一個不可見的 COMMIT TRANSACTION 語句限制。 為 OFF 時,事務模式為自動提交。
--用@@TRANCOUNT來測試是否已經開啟一個事務.
---SELECT @@TRANCOUNT結果是1,意思是當前連線已經打開了一個事務。0的意思是當前沒有事務,一個大於1的數的意思是有巢狀事務。
[email protected]@TRANCOUNT的值是1,這個時候必須提交或者回滾事務,不然等到會話結束,表仍然是鎖住,會造成阻塞。
--{ commit | rollback } { tran | transaction};
--commit { tran | transaction} 提交事務。
--rollback { tran | transaction} 回滾事務。
示例:
--宣告資料庫引用
use testss;
go
--檢視implicit_transactions狀態
--declare @implicit_transactions varchar(10)='OFF';
--if((2&@@OPTIONS)=2) set @implicit_transactions='ON';
--select @implicit_transactions as implicit_transactions;
--設定隱式事務狀態開啟
set implicit_transactions on;
go
--開啟一個隱式事務
insert into test1(name,sex,age,height) values('測試隱式事務','女','20','180');
--判斷是否有隱式事務開啟,如果有則提交,沒有則回滾
if (select @@TRANCOUNT) is not null and (select @@TRANCOUNT)=1
commit tran;
else
rollback transaction;
go
示例結果:依次顯示事務執行結果和查詢事務執行結果。