URL: https://www.overclockers.at/coding-stuff/sql_rollback_transaction_funzt_nicht_196299/page_1 - zur Vollversion wechseln!
Code:BEGIN TRANSACTION CreateEmployee INSERT INTO Employee(LoginID,Title,Gender,....) VALUES (@LoginID,@Title,@Gender,....) INSERT INTO BankAccount (BankName,KTONR,BLZ,IBAN,BIC) VALUES (@BankName,@KTONR,@BLZ,@IBAN,@BIC) INSERT INTO BankAccountEmployee (EmployeeID,AccountID) VALUES ((SELECT max(EmployeeID) FROM Employee),(SELECT max(AccountID) FROM BankAccount)) ROLLBACK TRANSACTION CreateEmployee COMMIT TRANSACTION CreateEmployee GO
Eine Transaktion hat einen Anfang (BEGIN) und ein Ende (ROLLBACK *oder* COMMIT).
Du hast eine Transaktion, die du mit ROLLBACK beendest, und dann ein überflüssiges COMMIT.
(ein ROLLBACK ohne irgendeiner Bedingung am Ende ist allerdings wenig zweckmäßig, wenn du jemals irgendwelche Daten in die Datenbank füllen willst )
Hmmm, also in den Beispielen auf MSDN steht aber wenn ich das nicht völlig falsch verstanden hab, das ein ROLLBACK in T-SQL zwischen BEGIN und COMMIT zu stehen hat. Wenn ich nur das ROLLBACK da hinschreibe ohne Bedingung, dann setzt er die Aktion wie du schon richtig feststellst immer zurück. Ich werde mal probieren sowas wie IF EXCEPTION != NULL davor zu setzen und poste dann hier rein wenn es so gehen sollte.
Was übrigens m.E. funktioniert:
BEGIN TRY
BEGIN TRAN T1
// ...
COMMIT TRAN T1
END TRY
BEGIN CATCH
ROLLBACK TRAN T1
END CATCH
GO
Also wie so ein schöner Try and Catch Block in C# oder Java. Das Problem dabei ist allerdings das er keinen Exception Code zurück gibt in diesem Fall , sondern nur das Rollback ausführt und somit das Error Handling das ich im Code Behind File programmiert habe nicht greift und nur eine "kann nicht eingefügt werden Meldung" anstatt des tatsächlichen Fehlers zurück gegeben wird.
du führst alles aus und machst danach ein rollback....
hmm
wieso führt er nur jedes mal ein rollback aus?
natürlich musst du das rollback an ne bedingung hängen, exception oder selbst mit count oder ähnlichem nachkontrolliern.
und wie that schon sagte => was soll das commit noch commiten? die transaktion wurde doch mim rollback schon zerstört
es gibt so viele gute links zum thema pl/sql + transactions + exceptions, so schwer is das ned
1. Benutze ich T-SQL und nicht PL/SQL
2. Habe ich ja nun schon eine Lösung gefunden wie das mit dem Rollback funzt
Wenn du dir das MSDN Beispiel anschaust für ROLLBACK dann steht das dort ohne Bedingung zwischen BEGIN und COMMIT. Da muss wohl für mich nicht ersichtlich im Text irgendwo stehen das man noch eine Bedingung braucht.
Jedenfalls ist das verbleibende Problem jetzt noch, das durch das Rollback die Exception Message die von der Transaktion eigentlich generiert werden würde "zerstört" wird. Das will ich aber vermeiden damit ich im C# Code über e.Exception.Message (e ist vom Typ object) den Fehler auslesen kann damit ich dem Benutzer eine Nachricht über den genauen Fehler geben kann, anstatt einfach nur die plumpe Aussage "hat nicht geklappt".
Code: PHPFeedback.Text = "Es konnte leider keine Änderung vorgenommen werden. Setz dich bitte mit dem Administrator in Verbindung." + " (" + DateTime.Now + ")"; if (e.Exception != null) /* We want to avoid showing Server Error Pages to the user so we output the error text to a label */ { Feedback.Text = e.Exception.Message; e.ExceptionHandled = true; } break;
Du könntest ja im Catch Block nach dem Rollback selbst einen Fehler auslösen mit RAISERROR
Die Message kannst du dir ja selbst zusammen basteln aus ERROR_LINE, ERROR_MESSAGE, ERROR_NUMBER, ERROR_PROCEDURE, ERROR_SEVERITY, ERROR_STATE
EDIT:
noch 2 msdn links dazu:
http://technet.microsoft.com/en-us/...y/ms175976.aspx
http://msdn.microsoft.com/en-us/library/ms178592.aspx
hth
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025