我记得我以前做的程序,调用SQLServer中的存储过程,如果执行过程中出现错误就会回滚,最近又做了一个程序,执行出了错误又不回滚,我现在也不明白默认的存储过程到底会不会回滚?请高手给个答案.

解决方案 »

  1.   

    我里面没有写那些BEGIN TRANSACTION   COMMIT TRANSACTION等代码,会不会回滚?
      

  2.   

    必须写BEGIN TRANSACTION   COMMIT TRANSACTION等代码才能回滚?
      

  3.   

    在代码中使用分布式事务TransactionScope,这个需要数据库支持,并打开相应的服务。
      

  4.   

    我的另外一个帖子:大家也看看吧,完了一起结掉
    http://community.csdn.net/Expert/topic/5188/5188497.xml?temp=.7404901一个存储过程要执行多条SQL语句,如果程序执行出错为了能够回滚是不是要如下写法?
    BEGIN TRANSACTION 
    EXEC SQL语句1
    SET @Error = @@ERROR
    IF @Error != 0 GOTO ERROR_HANDLEREXEC SQL语句2
    SET @Error = @@ERROR
    IF @Error != 0 GOTO ERROR_HANDLEREXEC SQL语句3
    SET @Error = @@ERROR
    IF @Error != 0 GOTO ERROR_HANDLER.....
    EXEC SQL语句N
    SET @Error = @@ERROR
    IF @Error != 0 GOTO ERROR_HANDLER
    COMMIT TRANSACTIONERROR_HANDLER:
    IF @@TRANCOUNT != 0 ROLLBACK TRANSACTION
    RETURN @Error有没有简单的写法不要写那么多的 SET @Error = @@ERROR IF @Error != 0 GOTO ERROR_HANDLER
      

  5.   

    sql中是要这样写的,c#代码会简单些,但是c#代码并不一定会回滚,如果你的数据库连接断了,那么就谈不上执行失败和回滚了。
      

  6.   

    必须加BEGIN TRANSACTION   COMMIT TRANSACTION才能回滚
      

  7.   

    存储过程中的sql命令属于事务处理范畴,即存储过程中的所有sql语句要么都执行,要么都不执行,即"原子性".
     
    你可以写一个存储过程来试试:
    create database test
    use test
    create datatable t1
    (
      tID int identity(1,1),
      tAction nvarchar(30)
    )
    gocreate proc p1
    as
    insert into t1 (tAction) values ('xxx')
    insert into t1 (tAction) values (bbb)
    因为 bbb 没有加引号 所以会出错 ,之前成功执行的 'xxx'也被回滚了
      

  8.   

    同意Dream6000
    不加BEGIN TRANSACTION   COMMIT TRANSACTION也会回滚
      

  9.   

    之前说错了  存储过程是不会被回滚的create table t2
    (
      tID int identity(1,1),
      tAction nvarchar(30) not null
    )
    gocreate proc p2
    as
    insert into t2 (tAction) values ('xxx')
    insert into t2 (tAction) values (null)
    exec p2
    虽然出错但 xxx  可以被写入
      

  10.   

    需要使用SqlTransaction类启动事务,或在存储过程中实现Sql 事务语句。
    http://blog.csdn.net/zhzuo/archive/2004/08/06/67037.aspx
      

  11.   

    Dream6000
    我用SqlServer 2005测试了一下,确实是回滚了啊,两条记录都没写入。
      

  12.   

    To : sxmsy888(网际浪子)  在SQLServer 2000下,之前我也认为会回滚,测试后发现并不回滚!
     SqlServer 2005下没有测试过