Use TestDB
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/*
Select 一下
有‘1‘,‘Name1‘和‘3‘,‘Name3‘, 说明只有第二句的错误被取消了*/
Use TestDB
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 为 ON 时,
如果执行 Transact-
SQL 语句产生运行时错误,
则整个事务将终止并回滚。
默认情况下它是OFF状态。
*/
Use TestDB
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
TransActionEnd Try
Begin Catch
Rollback
TransActionEnd Catch
/*
使用Try
Catch来捕获异常。
如果 TRY 块内生成的错误导致当前事务的状态失效,
则将该事务归类为不可提交的事务。
如果通常在 TRY 块外中止事务的错误在 TRY 内发生时,
就会导致事务进入不可提交状态。
不可提交的事务只能执行读操作或 ROLLBACK
TRANSACTION。
该事务不能执行任何可能生成写操作或 COMMIT
TRANSACTION 的 Transact-
SQL 语句。
如果事务被分类为不可提交的事务,则 XACT_STATE 函数会返回值 -1。
*/
Use TestDB
Declare @tranError int -- 定义变量
Set @tranError=0
Begin
TransAction Insert Into Person(PersonId,PersonName)
Values(‘1‘,‘Name1‘)
Set @tranError = @tranError + @@Error
Insert Into Person(PersonId,PersonName)
Values(‘1‘,‘Name1‘)
Set @tranError = @tranError + @@Error
Insert Into Person(PersonId,PersonName)
Values(‘3‘,‘Name3‘)
Set @tranError = @tranError + @@Error
If @tranError = 0
Commit
TransAction Else
Rollback
TransAction/*
自定义一个变量来判断最后是否发生过错误。
*/