日期:2014-05-19  浏览次数:20778 次

SQL事物回滚问题,大家帮小弟看看
CREATE   PROCEDURE   DBO.xxx
as
set   nocount   off
BEGIN   TRANSACTION    
update   eit_Class   set   orders=520   where   id=1
if   @@error   <>   0
begin
        --raiserror( '抱歉,更新时发生错误,更新失败! '16,1)
        ROLLBACK             /*回滚,取消修改*/
        return
end
insert   into   eit_Class(orders)     values( 'a ')    
if   @@error   <>   0
begin
        --raiserror( '抱歉,更新时发生错误,更新失败! '16,1)
        ROLLBACK             /*回滚,取消修改*/
        return
end
if   exists(select   1   from   eit_Class   where   id=1)
begin
        update   eit_Class     set   orders=111   where     id=1
        if   @@error   <>   0
        begin
                --raiserror( '抱歉,更新时发生错误,更新失败! '16,1)
                ROLLBACK             /*回滚,取消修改*/
                return
        end
end
else
begin
        insert   into   eit_Class(orders)     values(111)    
        if   @@error   <>   0
        begin
              --   raiserror( '抱歉,插入时发生错误,更新失败! '16,1)
                ROLLBACK             /*回滚,取消修改*/
                return
        end
end
COMMIT   TRANSACTION         /*提交事务,保持修改*/
GO


update   eit_Class   set   orders=520   where   id=1

以上这句没错   为什么不会写入库中?   我不要全部回滚


------解决方案--------------------
你整個存儲過程中只有一對begin tran和commit tran,並且把commit放到了最後,那麼當中間任何一步出錯的時候都會回滾以上所有操作的

把每個操作都分別放到一個事務中就行了