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;