先讲下事务执行流程:
BEGIN和COMMIT
PRINT @@TRANCOUNT --@@TRANCOUNT统计事务数量
BEGIN TRAN PRINT @@TRANCOUNT BEGIN TRAN PRINT @@TRANCOUNT COMMIT TRAN --只提交一个事务 PRINT @@TRANCOUNT COMMIT TRAN PRINT @@TRANCOUNT
结果:
ROLLBACK
PRINT @@TRANCOUNT BEGIN TRAN PRINT @@TRANCOUNT BEGIN TRAN PRINT @@TRANCOUNT ROLLBACK TRAN --回滚所有事务 PRINT @@TRANCOUNT
结果:
由上可知BEGIN TRAN 开始事务,使事务数量加一
COMMIT TRAN 使事务减一,提交最新开辟的事务
ROLLBACK 使事务数量直接减为0,也就是回滚
事务分类:
1.显示事务
2.隐式事务模式
3.自动提交事务
--显示事务
SET NOCOUNT ON SET IMPLICIT_TRANSACTIONS OFF --设置为显示事务模式,也就是自动提交模式 PRINT '显示事务开始前:'+CAST(@@TRANCOUNT AS varchar(10)) GO IF EXISTS(SELECT *FROM sys.tables WHERE name='Table1') DROP TABLE Table1 CREATE TABLE Table1 ( col1 int ) GO INSERT INTO Table1 VALUES(1) PRINT '插入数据时事务数:'+CAST(@@TRANCOUNT AS varchar(10)) BEGIN TRAN PRINT '开始事务时的事务数:'+CAST(@@TRANCOUNT AS varchar(10)) COMMIT TRAN GO PRINT '提交事务后的事务数:'+ CAST(@@TRANCOUNT AS varchar(10)) GO
结果:
--隐式事务模式
SET IMPLICIT_TRANSACTIONS ON --打开隐式事务模式 INSERT INTO Table1 VALUES(2) INSERT INTO Table1 VALUES(2) PRINT '插入数据时事务数:'+CAST(@@TRANCOUNT AS varchar(10)) COMMIT TRAN --如果不显示提交事务,那么如果下一条语句是(INSERT,DELECT,UPDATE,CREATE,TRUNCAST TABLE ,所有DROP,ALTER TABLE,GRINT,REVOK,SELECT)就会自动新建一个事务 PRINT '提交隐式事务后的事务数:'+CAST(@@TRANCOUNT AS varchar(10)) GO
结果:
--自动提交事务
--当设置IMPLICIY_TRANSACTIONS OFF 就恢复为自动提交模式 SET IMPLICIT_TRANSACTIONS OFF GO INSERT INTO Table1 VALUES(3) --没有错误自动提交 PRINT @@TRANCOUNT INSERT INTO Table1 VALUES(3,3) --有错误自动回滚 PRINT @@TRANCOUNT
结果:
--没有错误自动提交
--有错误自动回滚