如我有存储过程
A
begin tran
  ....
commit
---------------------
B
begin tran
  ....
commit然后我有事务oo.BeginTranction()
try
{
    .... //执行一些更新
     ....//调用A存储过程
    .....//调用B存储过程
}
catch
{
   oo.Rollback
}
finally
{
    oo.Dispose();
}如果上面的代码
当在执行B存储过程的时候出错
事务进行回滚
那么A存储过程中的已经提交的会不会回滚如果不会那要怎么办
谢谢

解决方案 »

  1.   

    IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = 'user_OffLineBank_FlowforMoneyRight')
    BEGIN
    DROP  Procedure  user_OffLineBank_FlowforMoneyRight
    END
    GOCREATE Procedure user_OffLineBank_FlowforMoneyRight
    (
    @id int
    )
    AS
    declare @iErrorCode int 
    Select @iErrorCode = 0

    declare @bill_id int
    declare @bill_list varchar(20)

    Select @bill_id=0
    Select @bill_list = ''


    Select 
    @bill_id = bill_id
    from 
    user_OffLineBank_Flow 
    where 
    id=@id
    Select @bill_list=bill_list from Bill_Orders Where ID=@bill_id

    Begin TRANSACTION
    if @iErrorCode = 0
    Begin

    Update
    Ticket_Bookings
    Set
    PaymentStat='0002'
    Where
    ID=Convert(int,substring(@bill_list,4,7)) 

    Select @iErrorCode = @@Error
    End

    If @iErrorCode = 0
    Begin
    Commit TRANSACTION
    End
    Else
    Begin
    ROLLBACK TRANSACTION
    End
    GO
      

  2.   

    你既然在类里面进行了事务操作
     就不用在存储过程A和B里面进行事务操作了或者你把A和B放到一个事务里面,类里面就不用写事务操作不过你这样写也没问题
    事务失败后自动回滚
      

  3.   

    应该是可以的,具体你自己试吧,首先也是必须的,Command必须要有,没就当我没说吧,然后,存储过程和Command绑定,最后就是,Command可以是<List>,
    总结:也就是事务里多个Command/
      

  4.   

    RE:
    你既然在类里面进行了事务操作 
    就不用在存储过程A和B里面进行事务操作了 
    或者你把A和B放到一个事务里面,类里面就不用写事务操作 
    ----------------------------------
    因为事务A,B是DB组做的
    而如果我要调用这个方法还要把内容照着写在我事务的话
    那么他们改了A,B存储过程,那我不是又要改
    这样不符合逻辑谢谢
      

  5.   

    A成功执行,不回滚。或在B出错时,执行其他过程,取消A的操作
      

  6.   

    A 会回滚,因为 A 和 B 同处一个事务内~
      

  7.   

    begin tran 
      A
    B
    commit AB 任何一个执行不成功都会回滚