Wir hatten das Letzte mal bei einer Pizza eine Spande  Diskussion über Transaktionen im SQL Server 2000. Die runde bestand aus zwei Sys-Admins  einem WI und einen Software Devloper. Irgendwann Kamm das Thema mit der Lange einer Transaktion auf bzw was passiert wen ein anderer Prozess in der gleichen Zeit auf eine Row (Zeile) zugeiffen will. Nach dem wir uns nicht richtig einig geworden sein will ich den beweis antreten. Das Setup besteht aus einem SQL Server 2000 ohne SP und SA PW(ich weiss das ist böse aber in VM was Solls).

Die ganze Ding  ist auch ganz Easy aufgebaut.

RS1

Zum Simulieren von 2 Verschiedenen Prozessen nehme ich 2 SQL Query Anlyzer. Im Ersten starte ich eine Transaktion und werde das "Value" um eins nachzählen, die Transaktion aber noch nicht abschliessen. Dann werde ich im zweiten Query Anlyzer den wert der zuerst auslesen und danach auf 20 Setzen. Jetzt werde ich die Transaktion abschliessen.

Jetzt ist die Grosse Frage was ist der Wert im "Value" möglich währe 20, 2, 22 oder ein Absturz des SQL Server’s :-)

rs2

 

 

Wir Start also die Transaktion und machen einen Update um plus eins. Wir bemerken die "–" welche das "commit tran" zum Kommentar erklären.

 

 RS3

Der Select kann keinen wert auslesen da sie Tabelle von der Transaktion blockiert wird. Wir sehen das Query lauft auf diesem bild bereits 3min 12 Sek. Also brechen wir das mal ab und starten den Update auf den Wert "20". es zeigt sich wieder das gleiche Phänomen.

 

 

RS4

Im Enterprise Manager sehen wir schön die Gebockten Prozesse. in der Datenbank.

So also zur Auflösung: Da ich den Update gemacht habe während der Transaktion und ihn laufen lassen habe, "commit tran" ausfuhrt habe. Der Update sich innert Sekunden gelöst hat, wurde das Value welches 2 wahr mit 20 überschreiben. Das Ergebniss ist also ZWANZIG

I Win You Lose :-)