1. 程式人生 > >SQLServer之建立隱式事務

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

示例結果:依次顯示事務執行結果和查詢事務執行結果。