ALTER PROCEDURE [dbo].[up_OpenTryService]AS
BEGIN TRANSACTION
/**//* ------- 更新操作 ---------- */
update 表名 set ...
    if @@RowCount <> 1
    begin
      RAISERROR('错误1', 16, 1)
      goto Problem
    end

/**//* ------- 增加操作 ---------- */
insert into 表名...
    if @@RowCount <> 1
    begin
      RAISERROR('错误2', 16, 1)
      goto Problem
    end COMMIT TRANSACTION
    returnProblem:
    Rollback Transaction
我想使数据一致性,就是更新和插入同时进行,上面的事务处理有什么问题吗,我用c#测试的时候,为什么没有一致呢,模拟出错的时候,事务没回滚,有时候更新成功了但是没有插入

解决方案 »

  1.   

    ALTER PROCEDURE [dbo].[up_OpenTryService]AS
        BEGIN TRANSACTION
        update 表名 set ...
        if @@RowCount <> 1 -->只更新一条吧?@@RowCount=1,下同。
        begin
          RAISERROR('错误1', 16, 1)
          goto Problem
        end
        
        insert into 表名...
        if @@RowCount <> 1
        begin
          RAISERROR('错误2', 16, 1)
          goto Problem
        end    COMMIT TRANSACTION
        returnProblem:
        Rollback Transaction
      

  2.   

    --> 改为 >0 再测试
    ALTER PROCEDURE [dbo].[up_OpenTryService]AS
        BEGIN TRANSACTION
        update 表名 set ...
        if @@RowCount > 0
        begin
          RAISERROR('错误1', 16, 1)
          goto Problem
        end
        
        insert into 表名...
        if @@RowCount > 0
        begin
          RAISERROR('错误2', 16, 1)
          goto Problem
        end    COMMIT TRANSACTION
        returnProblem:
        Rollback Transaction
      

  3.   

    你UPDATE的时候可能会UPDATE了两条或多条,最好不成功用@@rowcount = 0来判断
      

  4.   


    每次操作如果等于一条就成功,否则就失败楼主还有考虑并发性
    每次rowcount的值都是不一样的