BEGIN TRANSACTION
insert table1--这一句OK
insert table2--执行这一句出错
IF @@ERROR>0
BEGIN
ROLLBACK
END
ELSE
COMMIT
我希望是insert table2出错的话,把insert table1也回滚回去,请问下怎么修改上面的事物控制语句呢?

解决方案 »

  1.   

    create TABLE tb1 (id INT,col VARCHAR)
    create TABLE tb2 (id INT,col2 VARCHAR)BEGIN TRANSACTION
    insert INTO tb1(id,col) SELECT 1,'a'
    insert INTO tb2(id,col2) SELECT 'b',3
    IF @@ERROR>0
    BEGIN
    ROLLBACK
    END
    ELSE   
    COMMITSELECT * FROM tb1
    SELECT * FROM tb2 
    lz写的这个就OK哦。
      

  2.   

    锁定问题点了,原来是虽然出错,但@@ERROR仍然等于0,在查询分析器里的报错是“不能在具有唯一索引 'ix_sodetail_isosid' 的对象 'dbo.so_sodetails' 中插入重复键的行。”,难道这个错误不能让@@ERROR>0吗?if条件改怎样写才能抓到错误呢?
      

  3.   

    改用try ...catch...具体语法查看联机丛书
      

  4.   

    自05以后,添加了try catch语句,比@@error更灵活,更方便
    @@error这个我一直觉得与事务一起,起的作用不大,因为如果一旦错误的级别高了,会引起进程中断,中断后,后面的语句都执行不了了
    而try catch可以有效防止一些高级别的错误中断