2015-05-02 2 views
0

Я смущен о сохранить сделку в следующей ситуации:может второй сохранить транзакции Т2 откатываются

  begin transaction 
      save transaction t1 
      delete from #t1 

      save transaction t2 
      begin try 
       delete from #t2 
       select 1/0 
      end try 
      begin catch 
       rollback transaction t1 
      end catch 

      begin try 
       delete #t3 
       select 1/0 
      end try 
      begin catch 
       rollback transaction t2 
      end catch 

Если есть ошибка после удаления # t2, t1 транзакции откатываются. Но я не могу понять, почему я получаю ошибку в транзакции откат транзакции t2. Я получаю сообщение об ошибке «Нельзя откат t2. Не найдено ни одной транзакции или точки сохранения этого имени. '. но в коде указывается точка сохранения t2.

ответ

1

Сохранить транзакцию как контрольно-пропускной пункт, который говорит, что до этого момента ваши изменения будут известны как заданное имя контрольной точки i..e T1, T2.

Если вы откатываете изменения до T2, ваши изменения, включая контрольные точки, созданные после T2, больше не будут существовать (из-за отката). Однако ваш контрольный пункт T1 остается в силе, поскольку он был создан до T2.

Вместо этого, если вы вернете изменения до контрольной точки T1, ваша контрольная точка T2 также будет отброшена назад и всякий раз, когда вы попытаетесь отменить транзакцию до тех пор, пока T2-SQL не выдаст ошибку, поскольку эта контрольная точка транзакции не существует.

drop table #tmp 
create table #tmp (value int) 
insert into #tmp values (1) 
select * from #tmp 

begin tran t1 
    insert into #tmp values (2) 
    select *, 'begin tran t1' from #tmp 

    save transaction t2 

    insert into #tmp values (3) 
    select *, 'save transaction t2, value {1,2} were aded before t2' from #tmp 

    if exists(select * from #tmp where value = 3) 
    begin 
     select *, 'rolling back until t2, value 3 will be removed' from #tmp 
     rollback tran t2--if transaction name is not specfied, complet transaction will be rolled back. 
    end 

    select *, 'value 3 no more exists' from #tmp 
    save transaction t3 

    insert into #tmp values (4) 
    select *, 'save transaction t3, value 4 will be commited' from #tmp 


commit tran 
    select *, 'you should be able to see 1, 2, 4' from #tmp 
Смежные вопросы