SQL Server 2005 - verwalten Gleichzeitigkeit auf den Tischen

stimmen
1

Ich habe diesen Prozess in einer ASP.NET-Anwendung kommt:

  • Starten Sie eine Verbindung
  • Starten Sie eine Transaktion
  • Legen Sie in eine Tabelle „Loaddata“ viele Werte mit der SqlBulkCopy-Klasse mit einer Spalte, die eine bestimmte LOADID enthält.
  • Rufen Sie eine gespeicherte Prozedur, die:
    • Lesen Sie die Tabelle „Loaddata“ für die spezifische LOADID.
    • Für jede Zeile hat eine Menge von Berechnungen, die Dutzende von Tabellen und schreiben die Ergebnisse in eine temporäre (#temp) Tabelle (Prozess, der mehrere Minuten dauern) Lesen impliziert.
    • Löscht die Zeilen in „LoadDate“ für die spezifische LOADID.
    • Sobald alles fertig ist, wird das Ergebnis in der Ergebnistabelle schreiben.
  • Commit-Transaktion oder Rollback, wenn etwas schiefgeht.

Mein Problem ist, dass, wenn ich 2 Benutzer haben, die den Prozess starten, wird die zweite warten, dass die vorherige beendet hat (weil der Einsatz scheint auf dem Tisch eine exklusive Sperre zu setzen) und meine Anwendung fällt manchmal in Timeout (und die Benutzer sind nicht glücklich zu warten :)).

Ich bin auf der Suche nach einem Weg, der Lage sein, um die Benutzer zu haben, die alles parallel tun, da es keine Wechselwirkung ist, mit Ausnahme der letzten: Schreiben Sie das Ergebnis. Ich denke, dass ich was blockiert die Einsätze sind / löscht in der „Loaddata“ Tabelle. Ich überprüfte die anderen Transaktionsisolationsstufen, aber es scheint, dass nichts mir helfen könnte.

Was wäre perfekt wäre in der Lage sein, die exklusive Sperre für die „Loaddata“ Tabelle zu entfernen (ist es möglich, SqlServer zu zwingen, nur Zeilen zu sperren und nicht die Tabelle?), Wenn der Einsatz beendet ist, aber ohne die Transaktion zu beenden.

Irgendein Vorschlag?

Veröffentlicht am 09/12/2008 um 14:38
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
1

wenn Sie sicher sind, dass es kein Problem mit cioncurrent Operationen mit Ausnahme des letzten Teil ist, warum die Transaktion nicht startet kurz vor diesen letzten Aussagen, je nachdem was sie sind, dass erfordert Isolation) und begeht sofort, nachdem sie Erfolg hat .. Dann werden alle im Voraus Leseoperationen nicht gegenseitig blockieren ...

Beantwortet am 09/12/2008 um 15:24
quelle vom benutzer

stimmen
1

Schauen Sie SET TRANSACTION ISOLATION LEVEL READ COMMITTED SNAPSHOT in der Onlinedokumentation auf.

Beantwortet am 09/12/2008 um 15:04
quelle vom benutzer

stimmen
1

Transaktionen sollten klein und schnell Ausführung decken Stücke von SQL / Code. Sie haben eine Tendenz, auf verschiedenen Plattformen unterschiedlich umgesetzt werden. Sie werden Tabellen sperren und dann die Sperre erweitern, wie die Änderungen so wachsen die anderen Benutzer Aussperren von Abfragen oder Aktualisieren der gleiche Zeile / Seite / table.

Warum vergessen Sie nicht, die Transaktion und Verarbeitungsfehler in einer anderen Art und Weise behandeln? Ist Ihre Datenintegrität durch die Transaktion truely gesichert ist, oder Sie tun können, ohne sie?

Beantwortet am 09/12/2008 um 14:43
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more