指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)由多个sql语句组成,必须作为一个整体执行
这些sql语句作为一个整体一起向系统提交,要么都执行、要么都不执行
语法步骤:
开始事务:BEGIN TRANSACTION --开启事务
事务提交:COMMIT TRANSACTION --提交操作
事务回滚:ROLLBACK TRANSACTION --取消操作
--建表 CREATE TABLE [Person]( [PersonId] NVARCHAR(100) PRIMARY KEY , ---主键 [PersonName] NVARCHAR(100) NULL )
/* 如果只有Begin TransAction和Commit TransAction 就算报错了,也是不会回滚的 Select * From Person */ Begin TransAction Insert Into Person(PersonId,PersonName)Values('1','Name1') Insert Into Person(PersonId,PersonName)Values('1','Name1') Insert Into Person(PersonId,PersonName)Values('3','Name3') Commit TransAction /* 如果只有Begin TransAction和RollBack TransAction 就算没报错了,还是会回滚的 Select * From Person */ --清除数据 Delete Person Begin TransAction Insert Into Person(PersonId,PersonName)Values('1','Name1') Insert Into Person(PersonId,PersonName)Values('1','Name1') Insert Into Person(PersonId,PersonName)Values('3','Name3') RollBack TransAction /* SET XACT_ABORT ON时,在事务中,若出现错误,系统即默认回滚事务,但只对非自定义错误有效 SET XACT_ABORT OFF,默认值,在事务中,回滚一个语句还是整个事务视错误的严重程序而定, 用户级错误一般不会回滚整个事务 Select * From Person */ SET XACT_ABORT ON -- 打开 Begin TransAction Insert Into Person(PersonId,PersonName)Values('1','Name1') Insert Into Person(PersonId,PersonName)Values('1','Name1') Insert Into Person(PersonId,PersonName)Values('3','Name3') Commit TransAction SET XACT_ABORT OFF -- 关闭 /* Try Catch 配合事务使用 Select * From Person */ Begin Try Begin TransAction Insert Into Person(PersonId,PersonName)Values('1','Name1') Insert Into Person(PersonId,PersonName)Values('1','Name1') Insert Into Person(PersonId,PersonName)Values('3','Name3') Commit TransAction End Try Begin Catch Rollback TransAction End Catch /* 使用全局变量@@Error 配合事务使用 Select * From Person */ DECLARE @tran_error int; SET @tran_error = 0; Begin TransAction Insert Into Person(PersonId,PersonName)Values('1','Name1') SET @tran_error = @tran_error + @@ERROR; print(@tran_error); Insert Into Person(PersonId,PersonName)Values('1','Name1') SET @tran_error = @tran_error + @@ERROR; print(@tran_error); Insert Into Person(PersonId,PersonName)Values('3','Name3') SET @tran_error = @tran_error + @@ERROR; print(@tran_error); IF(@tran_error > 0) BEGIN --执行出错,回滚事务 ROLLBACK TransAction; END ELSE BEGIN --没有异常,提交事务 COMMIT TransAction; END