fthomas 10 Geschrieben 20. Januar 2012 Melden Teilen 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 Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 20. Januar 2012 Melden Teilen 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 Zitieren Link zu diesem Kommentar
fthomas 10 Geschrieben 22. Januar 2012 Autor Melden Teilen 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 Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 22. Januar 2012 Melden Teilen Geschrieben 22. Januar 2012 Womit willst Du denn programmieren ? Sowas wird doch im Datenbanktreiber geregelt. Zitieren Link zu diesem Kommentar
fthomas 10 Geschrieben 22. Januar 2012 Autor Melden Teilen Geschrieben 22. Januar 2012 Mit dem sql server management studio.. Zitieren Link zu diesem Kommentar
zahni 554 Geschrieben 22. Januar 2012 Melden Teilen Geschrieben 22. Januar 2012 Schaue mal hier: Stored Procedure How-to Topics Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 23. Januar 2012 Melden Teilen 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 Zitieren Link zu diesem Kommentar
NilsK 2.934 Geschrieben 23. Januar 2012 Melden Teilen 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 Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.