为什么我的一个事物中,出错后表给锁住了,不能访问了,代码如下,其中表aa为缺少的对象,即在这里会报错,但是执行完后表TABLE2就不能访问了,会被锁上,这是为什么,怎么在出错后自动解锁?BEGIN TRANSACTION aaa--开始事务 DECLARE @errorSun INT --定义错误计数器
SET @errorSun=0 --没错为0
--删除原来表中的数据
delete from TABLE2 --事务操作SQL语句
SET @errorSun=@errorSun+@@ERROR --累计是否有错

UPDATE aa SET id=2 WHERE a=1 --事务操作SQL语句
SET @errorSun=@errorSun+@@ERROR --累计是否有错

IF @errorSun<>0
BEGIN
PRINT '有错误,回滚'
ROLLBACK TRANSACTION aaa--事务回滚语句
return  
END
ELSE
BEGIN
PRINT '成功,提交'
COMMIT TRANSACTION aaa--事务提交语句
return   
END

解决方案 »

  1.   

    另外, 你的代码中有潜在的问题
    @@ERROR 返回的结果正负都有, 所以你这样加可能导致正负抵销, 可以取绝对值再加
    当然, 这个问题只影响你后面的事务处理部分是否选择了正确的路径.
      

  2.   

    因为出恶性错后IF @errorSun <>0 
    BEGIN 
    PRINT '有错误,回滚' 
    ROLLBACK TRANSACTION aaa--事务回滚语句 
    return  
    END 
    ELSE 
    BEGIN 
    PRINT '成功,提交' 
    COMMIT TRANSACTION aaa--事务提交语句 
    return  
    END这些都没有执行到就异常中止了 事务也没提交也没回滚
      

  3.   


    --执行下面语句手工ROLLBACK
    ROLLBACK TRANSACTION aaa
      

  4.   

    想出错回滚
    事务开始之前加入
    SET XACT_ABORT ON
    试验一下SET XACT_ABORT ONBEGIN TRANSACTION aaa--开始事务 
      

  5.   

    楼主那样写不行的,如果第一句执行已经出现了错误,也可以继续往下执行
    应该是第一句错误后,马上跳转把错误处理,执行rollback tran语句