SQL事务(Transaction)-飞外

1、概念

指访问并可能更新数据库中各种数据项的一个程序执行单元(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 PersonBegin 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 PersonBegin 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 PersonSET 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 TransActionSET XACT_ABORT OFF -- 关闭 Try Catch 配合事务使用 Select * From PersonBegin 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 TransActionEnd TryBegin Catch Rollback TransActionEnd Catch 使用全局变量@@Error 配合事务使用 Select * From PersonDECLARE @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; BEGIN --没有异常,提交事务 COMMIT TransAction; END