Welcome to Sign in | Help
in Search

Transaction

Last post 11-17-2006, 1:44 AM by rremus. 6 replies.
Sort Posts: Previous Next
  •  11-06-2006, 1:31 PM 761

    Transaction

    Am patit un fapt interesant.

    Am urmatoarea situatie

    Fac insert cu o procedura stocata in 2 tabele cu o tranzactie

    BEGIN TRANSACTION

    INSERT INTO Tabela1 ....

    INSERT INTO Tabela2 ...

    COMMIT

    IF @ERROR <> 0

    ROLLBACK TRANSACTION

    La Tabela1 am in trigger AFTER INSERT care insereaza cate un rand in alte 3 tabele

    Problema : Totul a functionat perfect dar intr-o zi m-am trezit ca in Tabela1 nu a inserat dar in Tabela2 a inserat. Deasemeni desi in Tabela1 nu a inserat triggerul a functionat si a inserat cate un rand in cele 3 tabele.

    E vreo greseala pe undeva si nu o vad eu ?

    Sorin Sandu

     


    Sorin Sandu
    Filed under:
  •  11-06-2006, 2:11 PM 762 in reply to 761

    Re: Transaction

    SET XACT_ABORT ON  

    BEGIN TRANSACTION

    INSERT INTO Tabela1 ....

    IF @ERROR <> 0

    GOTO Failure

    INSERT INTO Tabela2 ...

    IF @ERROR <> 0

    GOTO Failure

    COMMIT

    RETURN

    Failure:

    ROLLBACK TRAN

     

    In plus trebuie error handling in trigger.


    Cristian Andrei Lefter, SQL Server MVP
    MCT, MCSA, MCDBA, MCAD, MCSD .NET,
    MCTS, MCITP - Database Administrator SQL Server 2005
    http://sqlserver.ro
  •  11-06-2006, 3:04 PM 764 in reply to 762

    Re: Transaction

    Totusi de ce triggerul a actionat daca in Tabela1 nu am rand inserat ?
    Sorin Sandu
  •  11-06-2006, 3:26 PM 766 in reply to 764

    Re: Transaction

    Fara cod e greu de comentat!

    Poate e un INSTEAD OF trigger.


    Cristian Andrei Lefter, SQL Server MVP
    MCT, MCSA, MCDBA, MCAD, MCSD .NET,
    MCTS, MCITP - Database Administrator SQL Server 2005
    http://sqlserver.ro
  •  11-07-2006, 2:39 PM 786 in reply to 762

    Re: Transaction

    Cristi,

    Daca ai folosit SET XACT_ABORT ON nu vad de ce ar mai trebui verificat @@ERROR-ul dupa fiecare instructiune. E suficient ori una, ori cealalta. Personal, eu prefer sa tin SET XACT_ABORT OFF si sa verific @@ERROR-ul.

    In al doilea rand, de ce trebuie error handling in trigger ? Daca apare o eroare intr-un trigger, se face automat rollback si se termina batch-ul care a declansat trigger-ul.

    Pentru detalii, vezi http://www.sommarskog.se/error-handling-I.html

    Razvan

  •  11-07-2006, 4:19 PM 787 in reply to 786

    Re: Transaction

    SET XACT_ABORT ON transforma majoritatea batch abort errors in transaction abort errors. Chiar la documentul respectiv m-am gandit cand am zis asta http://www.sommarskog.se/error-handling-I.html#XACT_ABORT. Majoritatea inseamna nu chiar toate. Din acest motiv inca mai verific @@ERROR-ul.

    De ce error handling in trigger? Desi un trigger trebuie sa fie by design rapid daca business logic-ul din spatele lui e complex atunci eu as face error handling si in trigger. Pe urma in acelasi document poti observa ca aproape toate erorile intr-un trigger determina un rollback automat. Aproape toate dar nu toate!


    Cristian Andrei Lefter, SQL Server MVP
    MCT, MCSA, MCDBA, MCAD, MCSD .NET,
    MCTS, MCITP - Database Administrator SQL Server 2005
    http://sqlserver.ro
  •  11-17-2006, 1:44 AM 905 in reply to 761

    Re: Transaction

    ssandu:

    Am patit un fapt interesant.

    BEGIN TRANSACTION
    INSERT INTO Tabela1 ....
    INSERT INTO Tabela2 ...
    COMMIT

    Ai patit un fapt banal. Ai comis o transactie fara ca sa te intereseza daca rezultatul ei e consistent sau nu. Daca verifici @@ERROR, trebuie sa-l verifici dupa fiecare statement. Daca primul INSERT a picat (e.g. unique constraint violation), al doilea INSERT va reseta @@ERROR. 

    Nu e clar din exemplu daca transactia este o subtranzactie intr-o alta tranzactie. Daca nu e, atunci codul e incorect si pentru ca incearca sa faca ROLLBACK dupa ce a facut COMMIT. Daca e, atunci codul risca sa devina incorect la o schimbare minora  (e.g. daca caller-ul nu mai porneste o tranzactie explicita). Normal COMMIT-ul se face pe un branch al IF-ului si ROLLBACK pe celalalt.

    Numai de bine,
    ~Remus


    http://rusanu.com
View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems