别人问我一个问题,说当要往主表和子表插入一条记录的时候主表里面的更新成功了,子表里面失败了,这时候怎么解决,我不会大家帮我看看!
ps:
我如果写了begin
 update t1 set....
 update t2 set....
  end
这样,会发生只更新了t1,而t2没更新的情况吗?我以为只要插入的数据类型都符合就不会失败了呀!

解决方案 »

  1.   

    从程序里面控制
    setautocommit()
    update
    update
    setcommit()
      

  2.   

    IF @@error <> 0
            BEGIN
             
                COMMIT TRANSACTION 
            END 
        ELSE 
            BEGIN 
     
                ROLLBACK TRANSACTION 
            END 
      

  3.   

    这种情况十分危险,可能破坏数据库的数据完整性,重要的数据最好使用事务控制。declare iErrCode  int
    set iErrCode = -1 -- 用于捕获@@error的值
    begin tran
        update t1 set....
        set iErrCode = @@error  -- 成功 iErrCode = 0,否则iErrCode != 0 if @@iErrCode = 0
    begin
        update t2 set....
        set iErrCode = @@error
    end
    .......if @@iErrCode = 0
      begin
          commit tran
      end
    esle
      begin
          rollback tran
      end
      

  4.   

    DECLARE @ERROR INT
    SET @ERROR = 0BEGIN TRAN
    UPDATE t1 SET...
    SET @ERROR=@@ERROR
    IF @ERROR <> 0
    GOTO ERR  
    UPDATE t2 SET...
    SET @ERROR=@@ERROR
    IF @ERROR <> 0
    GOTO ERR ERR:
    IF @ERROR= 0
       COMMIT TRANSACTION ;
    ELSE 
       ROLLBACK TRANSACTION 
      

  5.   

    BEGIN TRAN
    BEGIN TRY
    UPDATE t1 SET...
    UPDATE t2 SET...
    COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
    IF XACT_STATE()<>0
    ROLLBACK TRANSACTION
    END CATCH
    第二种方式
      

  6.   

    //可执行事务declare @@iErrCode  int
    set @@iErrCode = -1 -- 用于捕获@@error的值
    begin tran
        
        insert tb1(dasfdf,fasf) values(1909,2)
        set @@iErrCode = @@error  -- 成功 iErrCode = 0,否则iErrCode != 0 if @@iErrCode = 0
    begin
        insert tb1(dasfdf,fasf)  values(22,23)
        set @@iErrCode = @@error
    end
    if @@iErrCode = 0
      begin
          commit tran
      end
    else
      begin
          rollback tran
      end