Transaction

SQL, Dateimanagement - Sprachunabhängige Datenhaltung
Antworten
C@mper
Beiträge: 88
Registriert: Mo Nov 15, 2010 3:30 pm

Transaction

Beitrag von C@mper » Do Aug 18, 2011 9:34 am

Mit meiner PHP Anwendung stosse ich hier auf ein Problem im Zusammenhang mit der MS SQL Datenbank.
Da hier im Forum kein Bereich Datenbank existiert, setze ich es mal unter Webentwicklung, weil ich es in diesem Zusammenhang auch brauche.

Es ist etwas kompliziert und ich versuche mal, es verständlich zu beschreiben ;-)

Mit den in HTML Formularen erfassten Daten werden mehrere verkettete Inserts in die DB geschrieben.

INSERT Satz 1 (auto increment erzeugt eine neue Datensatz ID)
SELECT @@identity AS id (ermitteln der neu angelegten ID aus Satz 1)
INSERT Satz 2 (wobei die ermittelte ID aus Satz 1 mit in den Satz 2 einfliesst)
SELECT @@identity AS id (ermitteln der neu angelegten ID aus Satz 2)
INSERT Satz 3 (wobei die ermittelte ID aus Satz 2 mit in den Satz 3 einfliesst)
SELECT @@identity AS id (ermitteln der neu angelegten ID aus Satz 3)
UPDATE Satz x (wobei u.a. die ID's aus Satz 1, Satz 2, Satz 3 gespeichert werden)
.
.

Hierbei kann es vorkommen, dass ein Satz, durch welchen Fehler auch immer, nicht geschrieben wird, wodurch die Verkettung ins Nirwana läuft.

Im Hinterkopf hatte ich immer das Thema "Transaktionen (mssql Transaction)", also habe ich mich mal in das Thema eingelesen und stelle fest, dass nun noch mehr Fragen auftauchen als vorher. (Zu Anfang gab es schliesslich nur die Frage: "Was ist das?" ;-)

In der Theorie soll Transaction eine Reihe von Datebank Aktionen als eine Einheit durchführen und wenn's schiefgeht kann durch ein Rollback die Datenbank zurückgesetzt werden. Hört sich Perfekt an.

Hat sich schon mal jemand von Euch mit Transaktion befasst?

Wenn ja, folgenden Fragen konnte ich bisher nicht ausreichend klären:

- Werden die Daten lediglich Temporär im Datenbankspeicher gehalten und erst geschrieben, wenn alle Daten korrekt verarbeitet werden können?
- wie verhält es sich in diesem Fall mit den ID's? Sind die dann bereits vergeben oder kann ein anderer Benutzer diese plötzlich belegen?

- werden die Daten direkt in die DB eingetragen?
- Wenn nun nicht alle Daten verarbeitet werden können und ein Rollback durchgeführt wird, steht dann in der Zwischenzeit ein falsch verkettetes Fragment in der Datenbank?
- habe ich nach einem Rollback eine Lücke in den per autoincrement vergebenen ID's?

Über Tip's und Hinweise würde ich mich freuen, am Meisten jedoch über eine Anwort oder einen Link zu ausführlichen Doku's mit entsprechenden Antworten.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Transaction

Beitrag von Xin » Do Aug 18, 2011 10:21 am

C@mper hat geschrieben:Da hier im Forum kein Bereich Datenbank existiert, setze ich es mal unter Webentwicklung, weil ich es in diesem Zusammenhang auch brauche.
Jetzt gibt's eins.
C@mper hat geschrieben:- Werden die Daten lediglich Temporär im Datenbankspeicher gehalten und erst geschrieben, wenn alle Daten korrekt verarbeitet werden können?
- wie verhält es sich in diesem Fall mit den ID's? Sind die dann bereits vergeben oder kann ein anderer Benutzer diese plötzlich belegen?
Du startest eine Transaktion.
Alles, was Du dann machst, wird so gemacht, dass Du es rückgängig machen kannst.
Du schließt die Transaktion entweder ab oder startest ein "Rollback".
C@mper hat geschrieben:- werden die Daten direkt in die DB eingetragen?
Das würde ich beim Datenbankhersteller erfragen... Das ist wirklich eine komplexe Frage.
Ich gehe mal davon aus, dass die Datenbank für Dich sich so verhält, als hätte sie es eingetragen.
Ich kann mir aber auch gut vorstellen, dass Autoincrement-Ids nach einem Rollback Lücken aufweisen.
C@mper hat geschrieben:- Wenn nun nicht alle Daten verarbeitet werden können und ein Rollback durchgeführt wird, steht dann in der Zwischenzeit ein falsch verkettetes Fragment in der Datenbank?
Für Deine Verbindung vielleicht, ich gehe davon aus, dass für andere Verbindungen noch nicht durchgeführte Transaktionen nicht sichtbar sind.
C@mper hat geschrieben:- habe ich nach einem Rollback eine Lücke in den per autoincrement vergebenen ID's?
Davon gehe ich aus.
C@mper hat geschrieben:Über Tip's und Hinweise würde ich mich freuen, am Meisten jedoch über eine Anwort oder einen Link zu ausführlichen Doku's mit entsprechenden Antworten.
Ich denke, dass das sehr abhängig von der Datenbank ist.

Schreib Dir doch ein Programm und etabliere zwei Verbindungen zur Datenbank. Auf der einen Verbindung startest Du eine Transaktion, mit der anderen Verbindung fragst Du ab, ob Du sie schon sehen kannst.

Dann legst Du mit der zweiten Verbindung einen Datensatz an und führst auf der ersten ein Rollback durch.
Wenn die erste Verbindung einen Datensatz mit der Id 1 angelegt hat, müsste Verbindung zwei die Id 2 anlegen. Nach dem Rollback ist die 1 wieder frei. Legst Du nun einen neuen Datensatz an, wirst Du vermutlich die drei bekommen und die eins wird leer bleiben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

C@mper
Beiträge: 88
Registriert: Mo Nov 15, 2010 3:30 pm

Re: Transaction

Beitrag von C@mper » Di Aug 23, 2011 10:00 am

Nachdem ich nun das Transaction in mein Programm eingebunden habe, hier ein paar Infos zur Beantwortung meiner Fragen.
Nur für den Fall, dass evtl. nochmal jemand auf diese Fragen stösst oder einfach daran interessiert ist:

DB = MSSQL Express

- Bei Transaction werden alle Anweisungen zwischen 'BEGIN' + 'COMMIT' / 'ROLLBACK' der Reihe nach ausgeführt.
- Für fehlerfreie INSERT werden bei autoincrement neue ID's vergeben.
- Beim Fehlerhaften Satz bricht die Verarbeitung ab, es wird nichts in die DB geschrieben, auch nicht die fehlerfreien Sätze. (Diese wurden nur vorgemerkt)

- Beim nächsten Transaction werden neue ID's vergeben. Somit können bei autoincrement also Lücken entstehen.

- Beim 'ROLLBACK' werden die vorgemerkten Einträge wieder entfernt, nichts in die DB geschrieben, aber die per autoincrement erzeugten ID's wurden vergeben. Es entstehen also Lücken.

- Erst beim 'COMMIT' werden die Einträge in die DB geschrieben bzw. in der Datenbank 'sichtbar'.

- Es können mehrere Transaction benannt werden.
Solange für den ersten kein 'COMMIT' gesendet wird, sind die entsprechenden Tabellen in der DB blockiert. Die weiteren Transaction werden im Speicher gehalten. Sobald für den ersten das 'COMMIT' oder 'ROLLBACK' kommt, wird der Speicher der Reihe nach abgearbeitet.

Das ganze funktioniert in meiner PHP Anwendung super.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Transaction

Beitrag von Xin » Di Aug 23, 2011 10:11 am

C@mper hat geschrieben:Nur für den Fall, dass evtl. nochmal jemand auf diese Fragen stösst oder einfach daran interessiert ist:
Dieses Know-How ist Wiki-Relevant.

Wärst Du bereit daraus einen Artikel zu schreiben?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzername
Beiträge: 9
Registriert: Fr Apr 27, 2012 11:21 am

Re: Transaction

Beitrag von Benutzername » Fr Apr 27, 2012 11:43 am

Gute Zusammenfassung und einen Artikel gewiss wert. Da es sehr viele Feinheiten in diesem Thema gibt. Speziell bei den Datenbank Typen.

C@mper
Beiträge: 88
Registriert: Mo Nov 15, 2010 3:30 pm

Re: Transaction

Beitrag von C@mper » Mi Mai 02, 2012 6:01 am

Benutzername hat geschrieben:Gute Zusammenfassung und einen Artikel gewiss wert. Da es sehr viele Feinheiten in diesem Thema gibt. Speziell bei den Datenbank Typen.
Hatte es ins WIKI gestellt, aber der Artikel ist dort nicht mehr vorhanden ;-(

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Transaction

Beitrag von Xin » Mi Mai 02, 2012 9:35 am

C@mper hat geschrieben:Hatte es ins WIKI gestellt, aber der Artikel ist dort nicht mehr vorhanden ;-(
?

Wo hattest Du ihn denn hingestellt? Kannst Du Dich noch an die Seite erinnern? Also sowas wie 'db:transaction?'

Mir ist nicht bekannt, dass im Wiki bisher mal etwas verloren gegangen wäre und selbst wenn, müssten noch Sicherheitskopien vorhanden sein.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

C@mper
Beiträge: 88
Registriert: Mo Nov 15, 2010 3:30 pm

Re: Transaction

Beitrag von C@mper » Mi Mai 02, 2012 1:13 pm

Xin hat geschrieben: Wo hattest Du ihn denn hingestellt? Kannst Du Dich noch an die Seite erinnern? Also sowas wie 'db:transaction?'

Mir ist nicht bekannt, dass im Wiki bisher mal etwas verloren gegangen wäre und selbst wenn, müssten noch Sicherheitskopien vorhanden sein.
Stimmt :mrgreen:

Habe die URL aus meinen Histories wieder ausgegraben
Ursprünglich war er mal hier: http://www.proggen.org/doku.php?id=db:a ... ransaction
wurde dann aber hierher http://www.proggen.org/doku.php?id=dbs: ... ransaction
verschoben.

Allerdings... wenn man die URL nicht kennt, würde man den Text eh nie finden. Es gibt aber mittlerweile zu diesem Thema auch einen guten Text unter "Datenbanken - Einführung - Transaction" .

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Transaction

Beitrag von Xin » Mi Mai 02, 2012 2:16 pm

C@mper hat geschrieben:Mir ist nicht bekannt, dass im Wiki bisher mal etwas verloren gegangen wäre und selbst wenn, müssten noch Sicherheitskopien vorhanden sein.
Stimmt :mrgreen:

Habe die URL aus meinen Histories wieder ausgegraben
Ursprünglich war er mal hier: http://www.proggen.org/doku.php?id=db:a ... ransaction
wurde dann aber hierher http://www.proggen.org/doku.php?id=dbs: ... ransaction
verschoben.[/quote]
Okay, hier hat Mosi das Tutorial drübergepackt. Ich habe den Artikel jetzt mal auf die dbs:start verlinkt, die wird derzeit war quasi nicht angefahren, aber da muss eh was passieren und ich muss Mosi damit nächste Woche sowieso nerven.
C@mper hat geschrieben:Allerdings... wenn man die URL nicht kennt, würde man den Text eh nie finden. Es gibt aber mittlerweile zu diesem Thema auch einen guten Text unter "Datenbanken - Einführung - Transaction" .
Dann müssen die Texte entweder zusammengeführt werden oder differenziert werden.

Aber das DB-Kapitel liegt momentan eh eher in Trümmern, als sinnvoll da.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten