SQL2000中,事务回滚方式

1、If @@Error<>0
             roll back
      捕捉错误,然后显式回滚

2、使用xact_abort 开关 (一般不推荐使用)
        Set xact_abort on

use demo

--事务回滚
SET XACT_ABORT on
BEGIN TRAN
    
INSERT INTO score  VALUES (101,90)
    
INSERT INTO score VALUES (102,78
       
INSERT INTO score VALUES (107,76/**//* Foreign Key Error */ 
    
INSERT INTO score VALUES (103,81
    
INSERT INTO score VALUES (104,65
COMMIT TRAN
go

      结果:事务终止并全部回滚,结果为空。

3、SQL2005中,除了上面两种方式,还可用 Begin Try ...end Try  Begin Catch...End Catch 捕捉错误,然后显示回滚。

下面转发一篇博文,详细测试 方式2 :使用xact_abort 开关 进行事务回滚操作。

一、准备工作:

       1、首先我们创建测试数据库:

create   database  demo

    2、创建数据表和测试数据:(这里注意外键控制)

use  demo
CREATE   TABLE  student
(    
        stuid 
int   NOT   NULL   PRIMARY   KEY ,
        stuname 
varchar ( 50 )
)
CREATE   TABLE  score 
(
        stuid 
int   NOT   NULL   REFERENCES  student(stuid),
        score 
int
)
GO

INSERT   INTO  student  VALUES  ( 101 , ' zhangsan '
INSERT   INTO  student  VALUES  ( 102 , ' wangwu '
INSERT   INTO  student  VALUES  ( 103 , ' lishi '
INSERT   INTO  student  VALUES  ( 104 , ' maliu '

GO

二、各种用法及输出结果:

      1、语句1:

use  demo

-- Invoking a run-time error
SET  XACT_ABORT  OFF
BEGIN   TRAN
    
INSERT   INTO  score   VALUES  ( 101 , 90 )
    
INSERT   INTO  score  VALUES  ( 102 , 78
    
INSERT   INTO  score  VALUES  ( 107 , 76 /**/ /* Foreign Key Error */  
    
INSERT   INTO  score  VALUES  ( 103 , 81
    
INSERT   INTO  score  VALUES  ( 104 , 65
COMMIT   TRAN
go

      结果1:只回滚错误行,语句还继续执行。

-- select * from score
101      90
102      78
103      81
104      65

 

      2、语句2:

use  demo

-- 事务回滚
SET  XACT_ABORT  on
BEGIN   TRAN
    
INSERT   INTO  score   VALUES  ( 101 , 90 )
    
INSERT   INTO  score  VALUES  ( 102 , 78
    
INSERT   INTO  score  VALUES  ( 107 , 76 /**/ /* Foreign Key Error */  
    
INSERT   INTO  score  VALUES  ( 103 , 81
    
INSERT   INTO  score  VALUES  ( 104 , 65
COMMIT   TRAN
go

      结果2:事务终止并全部回滚,结果为空。

-- select * from score

      3、语句3:

use  demo

-- 事务在错误行终止,错误行回滚,错误行之前的不回滚
SET  XACT_ABORT  on
BEGIN
INSERT   INTO  score   VALUES  ( 101 , 90 )
    
INSERT   INTO  score  VALUES  ( 102 , 78
    
INSERT   INTO  score  VALUES  ( 107 , 76 /**/ /* Foreign Key Error */  
    
INSERT   INTO  score  VALUES  ( 103 , 81
    
INSERT   INTO  score  VALUES  ( 104 , 65
END
go

      结果3:出现这种是因为系统把每个insert语句都看成是单独的事务,所以错误行以前的是不回滚的。

-- select * from score
101      90
102      78