A 存储过程调用B 存储过程,在 A过程 中如何实现"事物处理"呢?
-----------------------------------------------------------------
在一个存储过程中 进行事物处理,我知道如何实现,但是,有时会遇到 一个存储过程调用另一个存储过程的情况.
因为这样结构化会好一些.如果将所有代码全写到一个过程中,不好维护呀.但是,A存储过程调用B存储过程,如何在A存储过程中进行"事物处理"呢?
也就是说,如果撤销事物,A过程中执行的代码可以撤销,但是B过程中已经执行的代码,不会被撤消呀!可是,我又想在"嵌套调用的存储过程"中 使用"事物处理",我的想法可以实现吗?

解决方案 »

  1.   

    create procedure pro1
    as
    begin tran
    exec pro2
    if @@ERROR <> 0
    rollback tran
    else
    commit tran Create procedure pro2
    as
    begin
    print 1
    End
      

  2.   


    我试了,pro2的执行,rollback后不会撤销呀?
      

  3.   

    --> 测试数据: #TA
    if object_id('TA') is not null drop table TA
    GO 
    create table TA (id varchar(8),name varchar(20) )
    insert into TA
    select '1','表1'  union all
    select '2','表2'  union all
    select '3','表3'  gocreate procedure pro1
    as
    begin tran
    update ta set name=name +'update' where id='1'
    exec pro2rollback tran
    go Create procedure pro2
    as
    begin
    update ta set name=name +'update' where id='2'
    End
    go 
    --test 
    exec pro1 select * from ta 我试了一下,可以回滚的
      

  4.   

    注释
    ROLLBACK TRANSACTION 清除自事务的起点或到某个保存点所做的所有数据修改。ROLLBACK 还释放由事务控制的资源。不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 回滚到事务的起点。嵌套事务时,该语句将所有内层事务回滚到最远的 BEGIN TRANSACTION 语句。在这两种情况下,ROLLBACK TRANSACTION 均将 @@TRANCOUNT 系统函数减为 0。ROLLBACK TRANSACTION savepoint_name 不减少 @@TRANCOUNT。