fthomas 10 Geschrieben 20. Januar 2012 Melden Geschrieben 20. Januar 2012 Hallo zusammen, ich möchte in einer Stored Procedure ein Insert in eine Tabelle machen. Diese Tabelle kann aber auch noch von anderen Stored Procedures bearbeitet werden (dann ist sie zu dem Zeitpunkt ja "gelockt"). Wenn die Tabelle gerade gelockt ist, und eine Stored Procedure trotzdem in die Tabelle einen Insert machen möchte, wie kann ich dann verhindern, dass der Insert fehlschlägt? Am besten wäre, wenn die Stored Procedure so lange warten würde, bis die Tabelle wieder freigegeben/"unlocked" ist. Danke, VG
NilsK 3.045 Geschrieben 20. Januar 2012 Melden Geschrieben 20. Januar 2012 Moin, normalerweise sollte die Transaktion ohnehin so lange warten, bis die Tabelle frei ist. Ist das bei dir nicht der Fall? Gruß, Nils
fthomas 10 Geschrieben 22. Januar 2012 Autor Melden Geschrieben 22. Januar 2012 Hi, achso, ok. Ich habe noch nicht mit der Programmierung angefangen, bin aber davon ausgegangen, dass der Insert standardmässig in einem solchen Fall fehlschlägt. Muss ich, um das von dir Beschriebene Verhalten zu erzeugen, das Insert-Statement extra in einen "begin transaction" ... "commit transaction"-Block packen? Weil du von Transaktion gesprochen hast.. VG
zahni 587 Geschrieben 22. Januar 2012 Melden Geschrieben 22. Januar 2012 Womit willst Du denn programmieren ? Sowas wird doch im Datenbanktreiber geregelt.
fthomas 10 Geschrieben 22. Januar 2012 Autor Melden Geschrieben 22. Januar 2012 Mit dem sql server management studio..
zahni 587 Geschrieben 22. Januar 2012 Melden Geschrieben 22. Januar 2012 Schaue mal hier: Stored Procedure How-to Topics
NilsK 3.045 Geschrieben 23. Januar 2012 Melden Geschrieben 23. Januar 2012 Moin, Muss ich, um das von dir Beschriebene Verhalten zu erzeugen, das Insert-Statement extra in einen "begin transaction" ... "commit transaction"-Block packen? Weil du von Transaktion gesprochen hast.. nein, das Verhalten ist Standard. Wenn du nichts anderes anforderst, isoliert SQL Server Transaktionen automatisch voneinander - das ist gewissermaßen eine seiner Hauptaufgaben. Sprich: Wenn eine Transaktion eine Ressource (z.B. Tabelle) nutzt, dann sperrt SQL Server die Ressource, bis die Transaktion beendet ist (Commit oder Rollback). Einzelne Aktionen bilden in sich eine Transaktion (Implicit Transaction). Das Kapseln mit BEGIN..END TRANSACTION brauchst du nur, wenn du mehrere Kommandos zu einer Transaktion zusammenfassen willst. In dem Fall bleiben die Sperren für alle Ressourcen, die in der Transaktion angesprochen werden, so lange erhalten, bis die Transaktion endet. Sobald eine Ressource gesperrt ist, warten andere Transaktionen, bis die Sperre aufgehoben wird. Ein Limit gibt es da, soweit ich mich erinnere, nicht, daher ist bei komplexen Applikationen einiges an Sorgfalt nötig, um Performanceprobleme durch Sperrkonflikte zu vermeiden. Gruß, Nils
NilsK 3.045 Geschrieben 23. Januar 2012 Melden Geschrieben 23. Januar 2012 Moin, Sowas wird doch im Datenbanktreiber geregelt. nein. Das Grundverhalten kommt vom Server. Alles Spezielle muss man in der Applikation regeln. Der Treiber stellt i.W. nur die Verbindung her. Gruß, Nils
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden