https://technet.microsoft.com/zh-cn/library/ms188317.aspxsql
爲鏈接將隱性事務模式設置爲打開以後,當數據庫引擎實例首次執行下列任何語句時,都會自動啓動一個事務:數據庫
在發出 COMMIT 或 ROLLBACK 語句以前,該事務將一直保持有效。在第一個事務被提交或回滾以後,下次當鏈接執行以上任何語句時,數據庫引擎實例都將自動啓動一個新事務。該實例將不斷地生成隱性事務鏈,直到隱性事務模式關閉爲止。測試
隱式事務模式,在這種模式中,SQL Server在沒有事務存在的狀況下會開始一個事務,但不會像在自動模式中那樣自動執行COMMIT 或ROLLBACK 語句。隱式事務必須顯式結束(既Commit 或者Rollback)。如下語句在沒有事務時隱式開始一個事務。 spa
ALTER TABLE事務 |
GRANTci |
FETCHget |
DELETEit |
CREATEio |
REVOKEtable |
INSERT |
SELECT |
DROP |
OPEN |
UPDATE |
TRUNCATE TABLE |
Ø 使用隱式事務
1. 啓動SQL Server Management Studio並打開一個「新建查詢」窗口。
2. 鍵入並執行如下語句來設置鏈接爲隱式事務模式(此例的代碼包含在示例文件UsingImplicitTransactions.sql中):
SET IMPLICIT_TRANSACTIONS ON;
GO
3. 執行如下代碼建立一個表檢驗是否已啓動事務:
CREATE TABLE T1
(i int PRIMARY KEY);
4. 用@@TRANCOUNT來測試是否已經打開一個事務。執行以下所示的SELECT語句:
SELECT @@TRANCOUNT AS [Transaction Count];
5. 結果是1,意思是當前鏈接已經打開了一個事務。0的意思是當前沒有事務,一個大於1的數的意思是有嵌套事務(詳見後文)。
6. 如今執行如下語句在表中插入一行並再次檢查@@TRANCOUNT:
INSERT INTO T1 VALUES(5);
GO
SELECT @@TRANCOUNT AS [Transaction Count];
@@TRANCOUNT的值仍然是1。因爲已經有一個打開的事務,所以SQL Server沒有開始一個新的事務。
7. 這個時候必須提交或者回滾事務,否則等到會話結束,表仍然是鎖住,由於事務沒有提交。如今執行如下語句回滾這個事務並再次檢查@@TRANCOUNT。能夠看出,在ROLLBACK TRAN 語句執行以後,@@TRANCOUNT 的值變成了0。
ROLLBACK TRAN
GO
SELECT @@TRANCOUNT AS [Transaction Count];
8. 嘗試對錶T1執行SELECT語句:
SELECT * FROM T1;
9. 因爲表不復存在,因此會獲得一個錯誤信息。這個隱式事務起始於CREATE TABLE語句,而且ROLLBACK TRAN語句取消了第一個語句後所作的全部工做。
10. 執行如下代碼關閉隱式事務:
SET IMPLICIT_TRANSACTIONS OFF;