otrdiena, 2011. gada 6. septembris

Vienmēr beidzam transakciju

Re ko es dabūju (man izskatās ļoti biedējoši):
"A severe error occurred on the current command.  The results, if any, should be discarded."
Jūs arī gribat?

Ņemam SQL Server 2005 (tieši 2005) un izveidojam procedūru, kas līdzīga šai:
Create proc dbo.test
as
Begin
    Begin Try
        Begin Tran; --!!!
        if(1=1)
            return;-- OPĀ!
        Commit --nekad nenotiek!
    End Try
    Begin Catch
        -- šeit tīri formalitāte
    End Catch
End
Un izpildām:
exec dbo.Test
Kļūda rokā..

Tas kā atgādinājums- ja reiz sākam transakciju, vienmēr, vienmēr padomājam, ka tā ir arī jāaizver (ar commit vai rollback). Šeit arī patiesais problēmas cēlonis ir tas, ka procedūras izpildes beigās ir vairāk transakcijas, nekā bija tai sākoties. Tas tā nedrīkst būt.

Tiesa gan, nesakarīgais kļūdas ziņojums ir SQL Server 2005 problēma/kļūda (sakombinējot kļūdu apstrādes bloku ar iesāktu, nepabeigtu transakciju. Savukārt, ja nav kļūdu apstrādes bloks, arī SQL Server 2005 izdod saprotamu kļūdas paziņojumu).

SQL Server 2008 atgriež jau pavisam smuku ziņojumu (smuks = izsaka lietas būtību):
Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1.

Nav komentāru:

Ierakstīt komentāru