Welcome to Sign in | Help
in Search

begin tran sql server 2000

Last post 03-06-2008, 1:28 AM by B_gd_n[ ]Sahlean. 9 replies.
Sort Posts: Previous Next
  •  03-05-2008, 5:43 PM 4289

    begin tran sql server 2000

    salut,

    am si eu o intrebare cu tranzactiile astea

    am o procedura1 in care am begin tran si la sfarsit commit sau rollback functie de erori...am eroare face rollback nu am eroare face commit

    si in interiorul careia se apeleaza o alta procedura2 care la randul ei are un begin tran si rollback sau commit (la fel functie de erori)

    in procedura2 nu pot umbla deloc pt a o modifica....deci modificarile pe care le pot face sunt doar in procedura1

    daca apare o eroare in procedura2 adica trece pe rollback spune ca nu poate face rollback pt ca nu are un begin tran...cum pot evita asta

    exemplu:


    begin  tran

    select 1
                begin tran 
                                     select 2
                rollback tran

    commit tran

    asta e eroarea primita
    The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

    multumesc

    alex.

     

  •  03-05-2008, 6:12 PM 4290 in reply to 4289

    Re: begin tran sql server 2000

    Un ROLLBACK face undo la toate tranzactiile precedente.

    Nu puteti avea mai multe ROLLBACK TRAN.

    Incercati sa folositi Savepoints pentru un rollback "Partial".


    Cristian Andrei Lefter, SQL Server MVP
    MCT, MCSA, MCDBA, MCAD, MCSD .NET,
    MCTS, MCITP - Database Administrator SQL Server 2005
    http://sqlserver.ro
  •  03-05-2008, 6:20 PM 4291 in reply to 4289

    Re: begin tran sql server 2000

    Vezi ce valoare are @@TRANCOUNT inainte si dupa apelul procedurii. In BOL de SQL 2005 exista un capitol "Rollbacks and Commits in Stored Procedures and Triggers" care pare sa fie OK si pentru cazul tau.

    * Cred ca te poti lipsi de tranzactia "din jurul" lui select2 din exemplul tau (?). Btw, exemplul e cam "cetos"...

  •  03-05-2008, 6:35 PM 4292 in reply to 4289

    Re: begin tran sql server 2000

    pentru fiecare Procedura stocata poti face

    DECLARE @ProcName nvarchar(128);
    SET @ProcName = OBJECT_NAME(@@PROCID);

    SAVE  TRAN @ProcName

    <cod>
    if succes
        COMMIT TRANSACTION @ProcName
    else
        ROLLBACK TRANSACTION @ProcName


    apoi,  in tranzactia mare, in functie de ce ti-au intors PS-urile, decizi Rollback sau commit ( in general, daca una din PS a facut Rollback, tranzactia mare face rollback)

    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  03-05-2008, 6:42 PM 4293 in reply to 4291

    Re: begin tran sql server 2000

    incerc sa mai explic inca o data...poate de data asta imi iese mai bine :)

    am facut o procedura1 care contine

    begin tran

       exec procedura2

       insert ....

       update....

    commit

    procedura2 contine la randul ei begin tran..........commit

    cum fac daca am o eroare in procedura1 si face rollback sa faca rollback si in procedura2 fara a modifica procedura2

    multumesc.

    alex.

  •  03-05-2008, 7:22 PM 4294 in reply to 4293

    Re: begin tran sql server 2000

    Alex:

    incerc sa mai explic inca o data...poate de data asta imi iese mai bine :)

    am facut o procedura1 care contine

    begin tran

       exec procedura2

       insert ....

       update....

    commit

    procedura2 contine la randul ei begin tran..........commit

    cum fac daca am o eroare in procedura1 si face rollback sa faca rollback si in procedura2 fara a modifica procedura2

    multumesc.

    alex.


    In procedura 2 fa SAVE  TRAN @ProcName , si Commit TRAN @ProcName  / Rollback TRAN @ProcName
    si intoarce 1 sau 0  - daca ai facut commit sau rollbacl
    La proc1 , dupa fiecare linie  , verifici @@Error

    acum cod din proc 1

    begin tran

    DECLARE @RC int

    EXECUTE @RC = procedura2

    if @RC = 0

    begin

        Rollback tran

        return

    end

       insert ....

    if @@Error  <> 0

    begin

        Rollback tran

        return

    end


       update....

    if @@Error  <> 0

    begin

        Rollback tran

        return

    end


    commit



    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  03-05-2008, 8:29 PM 4296 in reply to 4294

    Re: begin tran sql server 2000

    nu pot modifica absolut nimic in procedura2....regulile firmei....exista o alta solutie?

    multumesc

    alex.

  •  03-05-2008, 8:41 PM 4297 in reply to 4289

    Re: begin tran sql server 2000

    Alex:

    salut,

    am si eu o intrebare cu tranzactiile astea

    am o procedura1 in care am begin tran si la sfarsit commit sau rollback functie de erori...am eroare face rollback nu am eroare face commit

    si in interiorul careia se apeleaza o alta procedura2 care la randul ei are un begin tran si rollback sau commit (la fel functie de erori)

    in procedura2 nu pot umbla deloc pt a o modifica....deci modificarile pe care le pot face sunt doar in procedura1

    daca apare o eroare in procedura2 adica trece pe rollback spune ca nu poate face rollback pt ca nu are un begin tran...cum pot evita asta

    exemplu:


    begin  tran

    select 1
                begin tran 
                                     select 2
                rollback tran

    commit tran

    asta e eroarea primita
    The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

    multumesc

    alex.

    asa nu merge

    alter procedure 1

    begin tran

    try

    exec procedure2

    catch

    roolbak tran

     


    Secolul XXI ori va fi religios ori nu va fi deloc
  •  03-06-2008, 12:16 AM 4299 in reply to 4296

    Re: begin tran sql server 2000

    Alex:

    nu pot modifica absolut nimic in procedura2....regulile firmei....exista o alta solutie?

    multumesc

    alex.


    Cu miinile legate la spate ? Nu prea cred ca poti sa iti dai seama daca procedura2 a dat eroare sau nu daca nu intoarce cod de eroare...

    Ignat Andrei
    http://serviciipeweb.ro/iafblog
  •  03-06-2008, 1:28 AM 4300 in reply to 4296

    Re: begin tran sql server 2000

    Alex:

    nu pot modifica absolut nimic in procedura2....regulile firmei....exista o alta solutie?

    multumesc

    alex.


    O solutie buna e cea propusa de andrei
    ...
    begin tran

    DECLARE @RC int

    EXECUTE @RC = procedura2

    if @RC = 0

    begin

    Rollback tran

    return
    ...

    dar pleaca de la premisa ca procedura2 intoarce un INT care reflecta daca procedura sa executat sau nu cu succes. Banuiesc ca aceasta solutie ar pp. modificarea procedurii 2 fapt care nu se doreste.

    Ceea ce vrei tu ar putea fi denumita de un coleg ca o "ciobănie" sau un "oltenism".
    O posibila ideea ar fi sa verifici daca sunt prezente in baza de date anumite rezultate (valori, inregistrari, etc.) care sa indice daca procedura2 sa executat cu succes sau nu.

    De exemplu, putem pp. ca procedura2 daca este executata cu succes atunci rezultatul va fi ca in tabela A sunt adaugate inregistrari (minim o inregistrare). Daca nu, atunci nr. inregistrarilor din A va râmâne nemodificat dupa execuţia procedurii 2.
    ...
    begin tran

    DECLARE @nr_inregistrari_inainte INT
    DECLARE @nr_inregistrari_dupa INT
    SET @nr_inregistrari_inainte = (SELECT COUNT(*) FROM A)

    EXEC procedura2

    SET @nr_inregistrari_dupa = (SELECT COUNT(*) FROM A)

    if @nr_inregistrari_inainte = @nr_inregistrari_dupa

    begin

    Rollback tran

    return
    ...

    Evident tb. avut in vedere faptul ca aplicatia ruleaza intr-un mediu multutilizator ...

View as RSS news feed in XML
Powered by Community Server (Commercial Edition), by Telligent Systems