不会啊,commit/rollback是对应单独的事务,一个存储过程可以有多个

解决方案 »

  1.   

    多个事务,建议每个事务都有独立的事务名,rollback/commit会针对特定的事务名
      

  2.   

    这个存储过程确实没必要嵌套n多的事务。只有一种情况下,就是用savepoint xx,然后你可以commit xx 或者rollback xx。
      

  3.   


    create procedure  test_pro
    as
    beginDECLARE @TransactionName varchar(20) 
    set  @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
    begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName
    insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
    save transaction @TransactionName
    rollback transaction @TransactionName
    commit transaction
    end
    这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣;
    插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?
      

  4.   


    create procedure  test_pro
    as
    beginDECLARE @TransactionName varchar(20) 
    set  @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
    begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName
    insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
    save transaction @TransactionName
    rollback transaction @TransactionName
    commit transaction
    end
    这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣;
    插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?改成这样试试:create procedure  test_pro
    as
    beginDECLARE @TransactionName varchar(20) 
    set  @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
    begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条--注释这里就可以
    ---begin transaction @TransactionName
    insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
    save transaction @TransactionName
    rollback transaction @TransactionName
    commit transaction
    end
      

  5.   

    测试了,这样写可以,第二个事务不用begin
    --CREATE TABLE test (id VARCHAR(10),NAME VARCHAR(10))SELECT * FROM test
    ALTER PROCEDURE test_pro
    AS
        BEGIN
      
    --想实现插入小马哥,不插入孙大圣
            BEGIN TRANSACTION  
     
    INSERT  INTO test
    VALUES  ( '998888', '小马哥' ) --就插入这一条
     
    --BEGIN TRANSACTION t2 
    SAVE TRANSACTION t2
    INSERT  INTO test
    VALUES  ( '998887', '孙大圣') --这条插入后,马上回滚

    ROLLBACK TRANSACTION t2
     
     
            COMMIT TRANSACTION 
        END
      

  6.   


    create procedure  test_pro
    as
    beginDECLARE @TransactionName varchar(20) 
    set  @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
    begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName
    insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
    save transaction @TransactionName
    rollback transaction @TransactionName
    commit transaction
    end
    这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣;
    插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?改成这样试试:create procedure  test_pro
    as
    beginDECLARE @TransactionName varchar(20) 
    set  @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
    begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条--注释这里就可以
    ---begin transaction @TransactionName
    insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
    save transaction @TransactionName
    rollback transaction @TransactionName
    commit transaction
    end
    你说的也对,不过要把那个save 要放在insert的前面,就是7楼说的那样。
      

  7.   


    create procedure  test_pro
    as
    beginDECLARE @TransactionName varchar(20) 
    set  @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
    begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条begin transaction @TransactionName
    insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
    save transaction @TransactionName
    rollback transaction @TransactionName
    commit transaction
    end
    这样写提示差一个commit,如果我想实现实现插入小马哥,不插入孙大圣;
    插入小马哥是一个子事务,不插入孙大圣是一个子事务,写在一个存储过程中,该怎么改啊?改成这样试试:create procedure  test_pro
    as
    beginDECLARE @TransactionName varchar(20) 
    set  @TransactionName ='Transaction1'--想实现插入小马哥,不插入孙大圣
    begin transactioninsert into Student values('998888','小马哥','国际贸易','22') --就插入这一条--注释这里就可以
    ---begin transaction @TransactionName
    insert into Student values('998887','孙大圣','工商管理','99') --这条插入后,马上回滚
    save transaction @TransactionName
    rollback transaction @TransactionName
    commit transaction
    end
    你说的也对,不过要把那个save 要放在insert的前面,就是7楼说的那样。我的复合你要求了?
      

  8.   


    你说的是对的。还有一个疑问,不知道怎么解释?
    --我把倒数2,3行的rollback 和commit颠倒了下。实现先分别插入两条记录,最后的rollback把里面的插入都撤销了。为什么这里save transaction @TransactionName 之前一定要写begin transaction @TransactionName,不写提出那个计数器错误。
    --而没有颠倒前的代码,为什么可以直接写save transaction @TransactionName,前面不用begin先申明啊?
    create procedure  test_pro
    as
    beginDECLARE @TransactionName varchar(20) 
    set  @TransactionName ='Transaction1'begin transactioninsert into Student values('998888','小马哥','国际贸易','22')
    begin transaction @TransactionName
    save transaction @TransactionName
    insert into Student values('998887','孙大圣','工商管理','99')
    commit transaction @TransactionNamerollback transactionend
      

  9.   

    还有一个疑问啊!create procedure  test_pro
    as
    beginDECLARE @TransactionName varchar(20) 
    set  @TransactionName ='Transaction1'begin transactioninsert into Student values('998888','小马哥','国际贸易','22')
    begin transaction @TransactionName
    save transaction @TransactionName
    insert into Student values('998887','孙大圣','工商管理','99')
    rollback transaction @TransactionName  --这里rollback了不插入孙大圣rollback transaction    --这里总体rollback了,小马哥没有插入可以理解,不过孙大圣也没有插入有点疑问。rollback的rollback不是commit吗?end
      

  10.   

    rollback的rollback不是commit吗?不是,最外层的rollback就等于这整个操作都“没有发生过”,这个没有一个对立的意思。
      

  11.   

    哦。还是有之前那个问题啊,你说rollback或者commit的数量是不是和begin都是一样多的。如果一个存储过程中有5个rollback那么相对应的begin也是5个,commit一样? MSDN里没有把语法写的这么详细啊