webForumDet fria alternativet

Flera inserts där en går fel - rulla tillbaka

Databaser & SQL

4 svar · 504 visningar · startad av butiko

Medlem sedan jan. 2007152 inlägg
Frågan#1

Jag har en SP med 4 inserts. Säg att insert #3 misslyckas men att de två första har gått igenom, det skulle ju förstöra en hel del minst sagt... Finns det någon möjlighet att rulla tillbaka mina två första inserts? Är det i databasen (sql-server) man gör detta eller måste jag skapa logik för detta i koden...?

Medlem sedan feb. 200112 078 inlägg
#2

Det beror lite på hur du exekverar din procedur. I t.ex. ASP kan du hantera transaktioner med Context-objekt för att göra Commit och Aborts, som sedan sköter resten av hanteringen själv. Annars får du skriva din SP med stöd för transaktioner i T-SQL, med BEGIN TRANS, ABORT, COMMIT osv.

Sök på dessa kommandon eller "transaction stored procedure" så får du säkerligen bra uppslag.

Medlem sedan juni 200032 967 inlägg
Medlem sedan jan. 2007152 inlägg
#4

Toppen! I sin enklaste form bör det alltså gå att bara sätta tran runt mina inserts och se om @@ERROR innehåller något fel...?

BEGIN TRAN 

  INSER 1, INSERT 2...

IF @@ERROR <> 0 
BEGIN 
  ROLLBACK TRAN 
  RETURN "fel"
END

ELSE
  COMMIT TRAN
Medlem sedan jan. 2007152 inlägg
#5

Fel av mig, @@ERROR måste fångas upp direkt efter varje INSERT så ovanstående kod skulle inte fungera. Så här ska det nog se ut (någon får gärna verifiera):

BEGIN TRAN
    INSERT1...
    IF (@@ERROR <> 0) GOTO ERROR

    INSERT2...
    IF (@@ERROR <> 0) GOTO ERROR

COMMIT TRAN

RETURN 0

ERROR:
PRINT 'Unexpected error occurred!'
ROLLBACK TRAN
RETURN 1
265 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
123 ms — ändringar (db)