2016-05-19 12 views
0

Ich habe einen Webdienst erstellt, der neue Daten mit einem Iterator (Bigint) aus einer großen Tabelle (100 Millionen Zeilen) in einem Buchhaltungssystem (SQL Server 2008 R2 Standard Edition) abfragt.SQL Server Sperren auf SELECT

Der Anbieter der Datenbank hat uns gezwungen, nicht aufgegebene Transaktionen zu lesen, um sicherzustellen, dass wir die Tabelle für Einfügungen nicht sperren (Aktualisierungen werden nie vorgenommen).

In letzter Zeit hat uns das aufgrund von Rollbacks Probleme bereitet. Das Buchhaltungssystem weist Rollback-Zeilen auf, die aufgrund von Fehlern und Zeitüberschreitungen bereits vom Web-Service gelesen wurden, wodurch mein System Daten speichert, die niemals existieren sollten.

Ich denke gelesenen commited Daten würde dies lösen, aber der Accounting-System-Anbieter wird uns nicht lassen, da sie besorgt sind, dass es Einsätze in die Tabelle sperren wird.

Kann die Auswahl tatsächlich Blöcke blockieren und wie würden wir sie am besten lösen?

+0

Wie wäre es mit 'mit Nolock' – ChrisBint

+0

Das ist im Grunde, was ich tue (lesen Sie nicht committed) und das verursacht das Problem. Was ich tun möchte, ist verpflichtet zu lesen, ohne Einfügesperren zu verursachen. – FredrikR

+0

Ihr Provider muss die Datenbank so einstellen, dass sie die festgeschriebene Snapshot-Isolation liest: https://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server- ein Ratgeber/. Dadurch können Sie die Datensätze vor dem Beginn einer Transaktion lesen, ohne dass eine Transaktion blockiert wird. –

Antwort

0

Versuchen Sie, nur Daten auszuwählen, von denen Sie wissen, dass sie nicht schmutzig sind (d. H. Gerade geschrieben werden). Wenn Ihre Tabelle beispielsweise eine Spalte createddate enthält, die mit dem Datum gefüllt ist, an dem die Zeile in die Datenbank eingefügt wurde, erstellen Sie eine where-Bedingung, um nur Zeilen abzurufen, die nach 5 Minuten eingefügt wurden.

Beispiel

SELECT col1, col2, col3, createddate 
FROM table WITH(NOLOCK) 
WHERE createddate < dateadd(minute,-5,getdate()) 
0

Dieses so viel wie ein Design-Problem ist kein technisches Problem ist. Ich würde empfehlen, dass Sie eine neue Tabelle erstellen, die eine Kopie dieser Tabelle mit Committed-Transaktionen nach beliebigem Zeitrahmen ist, die erforderlich ist, um die festgeschriebenen Daten zu ermitteln. Andernfalls würde ich empfehlen, einen anderen Anbieter für Ihr Buchhaltungssystem zu finden.