一、全局变量@@TRANCOUNT:返回当前连接的活动事务数,可直接用PRINT打印输出。例:PRINT '当前活动事务数:'+CAST(@@TRANCOUNT AS VARCHAR(10))
二、事务分类:
1、显示事务:用BEGIN TRANSACTION明确指定事务的开始,是最常用的事务类型
USE MyServer
GO
SET NOCOUNT ON--不显示受影响的行数
PRINT '开始事务数:'+CAST(@@TRANCOUNT AS VARCHAR(10))--输出结果为0
BEGIN TRAN
PRINT '显示事务数:'+CAST(@@TRANCOUNT AS VARCHAR(10))--输出结果为1
COMMIT
PRINT '显示事务提交后的事务数:'+CAST(@@TRANCOUNT AS VARCHAR(10))--输出结果为0
GO
--注:输出的结果为:0、1、0,使用BEGIN TRAN,则开启事务,事务数为1,COMMIT提交后,
--事务数为0
2、隐式事务:通过SET IMPLICIT_TRANSACTIONS ON语句,将隐式事务模式设置为打开,其后的T-SQL语句将自动启动一个新事务,提交或回滚一个事务后,下一个T-SQL语句又将启动一个新事务
USE MyServer
GO
SET NOCOUNT ON--不显示受影响的行数
SET IMPLICIT_TRANSACTIONS ON --设置隐式事务模式
PRINT '开始事务数:'+CAST(@@TRANCOUNT AS VARCHAR(10))--输出结果为0
UPDATE Employee SET E_Age=30 WHERE E_Id=1
PRINT '修改语句后的事务数:'+CONVERT(VARCHAR(10),@@TRANCOUNT)--输出结果为1
COMMIT
PRINT '提交后的事务数:'+CONVERT(VARCHAR(10),@@TRANCOUNT)--输出结果为0
GO
--注:
--1、在隐式事务模式下,未手动开启BEGIN TRAN,执行SQL语句后,事务数增加为1,COMMIT提交
--后,事务数减少为0。
--2、在隐式事务模式下,未手动开启BEGIN TRAN,执行SQL语句后,未手动提交事务,而继续执行
--DDL、DML、TCL语句时,将自动开启下一个事务
3、自动提交事务:当设置为显式事务模式 IMPLICIT_TRANSACTIONS OFF,就恢复成自动提交模式,系SQL Server的默认模式,每条单独的T-SQL语句视为一个事务
SET IMPLICIT_TRANSACTIONS OFF
INSERT INTO Table1 values(4)--没有错误,自动提交
PRINT @@TRANCOUNT--事务数为0
INSERT INTO Table1 VALUES(3,5)--出现错误,自动回滚
PRINT @@TRANCOUNT--事务数为0
三、嵌套事务:
1、COMMIT对事务数的影响
PRINT @@TRANCOUNT
BEGIN TRAN--事务数为+1
PRINT @@TRANCOUNT
BEGIN TRAN--事务数+1
PRINT @@TRANCOUNT
COMMIT TRAN--事务数-1
PRINT @@TRANCOUNT
COMMIT TRAN--事务数再-1
PRINT @@TRANCOUNT
GO
--注:输出结果为:0、1、2、1、0,即每遇到一次BEGIN TRAN,则事务数加1,每遇一次COMMIT,
--则事务数减1。
2、ROLLBACK对事务的影响
PRINT @@TRANCOUNT
BEGIN TRAN--开始事务,事务数+1
PRINT @@TRANCOUNT
BEGIN TRAN--事务数+1
PRINT @@TRANCOUNT
ROLLBACK TRAN
PRINT @@TRANCOUNT--输出结果为0
GO
--注:输出结果为:0、1、2、0,即每遇到一次BEGIN TRAN,则事务数加1,而遇到ROLLBACK,
--则事务数为0