2013-10-08 3 views
5

i eine Schleife haben, während in SQL, die etwas tun, wie esDie Subtransaktion kann nicht rückgängig gemacht werden. Keine Transaktion oder Sicherungspunkt dieses Namens gefunden wurde

begin tran one 

    do some inserts in others tables 

     --start loop 
    begin tran two 
     --do something 
     begin try 
--if something fail then a trigger does rollback and this return a error (and this goes to catch), then don't i need do the rollbak in catch? this could not be dissable because this is working on production 
     --something finished ok 
     commit tran two 
     end try 
     begin catch 
    rollback tran two 
     end catch 

    --finished loop 
    commit 


---------- 

ich diese Fehlermeldung bekam

Commit Transaktion am Ende des Ansatzes erkannt wird . Die Transaktion wird zurückgesetzt.

begin tran one 
begin tran two 

rollback tran two 

diesen Code zu tun bekomme ich diese:

Kann nicht wieder zwei rollen. Es wurde keine Transaktion oder ein Sicherungspunkt dieses Namens gefunden.

Ich möchte nur die Unterabfrage die zweite Schleife Rollback und mit anderen Datensätzen fortfahren.

+0

Bewertung diese Frage: http://stackoverflow.com/questions/4614942/how-can-i-sicherstellen-dass-verschachtelte-transactions-committed-unabhängig-von-jedem-ot Achten Sie besonders auf die Links in der oberen Antwort. – NotMe

+0

Im Wesentlichen gibt es keine verschachtelten Transaktionen im SQL-Server. – NotMe

Antwort

6

Operator Rollback Rollback alle Transaktion, für Rollback nur zweite Schleife Sie müssen Sie Savepoints verwenden:

begin tran one 

-- do some inserts in others tables 

    --start loop 
    save tran two -- begin tran two 

    --do something 
    begin try 
    update product set id = 1 --if something fail then a trigger does rollback and this return a error (and this goes to catch), then don't i need do the rollbak in catch? this could not be dissable because this is working on production 

    --something finished ok 
    commit tran two 
    end try 
    begin catch 

    rollback tran two 
    end catch 

--finished loop 
commit 

Trigger Beispiel:

create table product (id int) 
GO 
create trigger product_trigger on product for update 
as 
    set xact_abort off 

    if (select count(*) from inserted i join product p on i.id=p.id)=0 begin 
    if (@@trancount>0) begin 
     /* rollback */ 
     raiserror('product does not exist', 16, 1) 
    end 
    end 
+0

Nun, das ist in Ordnung, wenn ich die erste transacion umbenennen kann, aber wie gesagt, es gibt einen Trigger, der Rollback macht, dann konnte ich es nicht ändern, weil dies auf Produktion ist, und dies Rollback nur funktioniert, könnte dies funktionieren, wenn dies der Fall ist Rollback, aber das Rollback nur, dann funktioniert dieser Code nicht. – angel

+0

Können Sie ein Arbeitsbeispiel mit Trigger geben? – Alexandr

+0

if (Wählen Sie Anzahl (*) von eingefügt ich beitreten Produkt p auf i.id = p.id) = 0 beginnen, wenn (@@ trancount> 0) Rollback starten raiseerror ('Produkt existiert nicht') Ende Ende – angel

Verwandte Themen