START TRANSACTION;
INSERT INTO A VALUES(NULL,'2');
INSERT INTO A VALUES(NULL,'1');
COMMIT;
第二个字段是UNIQUE的,'1'已经存在,'2'没有存在
执行后,'2'还是被插入了,事务不是所有语句成功才执行吗?

解决方案 »

  1.   

    不会自动回滚的得你自己回滚
    而且你最后已经COMMIT 表示就算出错也会执行beigin tran //开始
    declare @error1 int  //设置变量接收异常
    if @error<>0        //如果有异常 回滚
    rollback tran
    else
    commit tran         //否则提交
    go 
      

  2.   

    up,楼上的意见,需要显示控制,出错要提交Rollback trans
      

  3.   

    --一旦存在错误不提交SET XACT_ABORT on
    begin tran;
    insert into dbo.t select 'aewdf','2','asrf' 
    INSERT INTO A VALUES(NULL,'2');--表不存在
    INSERT INTO A VALUES(NULL,'1');--表不存在if @@error<>0        --如果有异常 回滚
    begin
    select @@error
    rollback tran
    end 
    else
    begin
    commit tran        --否则提交
    end 
    /*
    (1 行受影响)
    消息 208,级别 16,状态 1,第 4 行
    对象名  'A' 无效。
    */
    select * from t
    /*
    --无任何数据
    */
    --一旦存在错误,只提交成功的
    SET XACT_ABORT off
    begin tran;
    insert into dbo.t select 'aewdf','2','asrf' 
    INSERT INTO A VALUES(NULL,'2');--表不存在
    INSERT INTO A VALUES(NULL,'1');--表不存在if @@error<>0        --如果有异常 回滚
    begin
    select @@error
    rollback tran
    end 
    else
    begin
    commit tran        --否则提交
    end 
    go
    /*
    (1 行受影响)
    消息 208,级别 16,状态 1,第 4 行
    对象名  'A' 无效。
    */
    select * from t
    /*
    第一行正常提交
    id          name                                     2123                                               sefa
    ----------- ---------------------------------------- -------------------------------------------------- --------------------------------------------------
    19          aewdf                                    2                                                  asrf
    20          aewdf                                    2                                                  asrf
    */
      

  4.   

    简单来说就参考这个
    http://tianjianbin203.blog.163.com/blog/static/865684592010020105244896/
      

  5.   

    关键在这里- -BEGIN TRAN标记事务开始COMMIT TRAN 提交事务一般把DML语句(select ,delete,update,insert语句)放在BEGIN TRAN...COMMIT TRAN 之间作为一个事务处理也就是那些语句执行过程中如果遇到错误,无论哪句遇到错误,所有语句都会回滚到BEGIN TRAN之前的状态。联机帮助:当 SET XACT_ABORT 为 ON 时,如果执行 Transact-SQL 语句产生运行时错误,则整个事务将终止并回滚。 当 SET XACT_ABORT 为 OFF 时,有时只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。如果错误很严重,那么即使 SET XACT_ABORT 为 OFF,也可能回滚整个事务。简单来说就是你错误不够严重- -