SQL server: Verhinderung der Sperre der Tabelle während der Einfügungen in einer loop

Ich habe eine Transaktion:

BEGIN TRANSACTION OPEN cursor FETCH NEXT FROM cursor INTO @i WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO BigTable () VALUES () WAITFOR DELAY '00:01:00'; FETCH NEXT FROM cursor INTO @i END COMMIT; 

Das Problem ist, dass die Transaktion BigTable für die gesamte loop und WAITFOR DELAY time WAITFOR DELAY .

Wie kann man verhindern, dass der Tisch nur bei INSERT s gesperrt wird?

Transaktionssperrtabelle

Die Transaktion sperrt die Tabelle nicht , sie sperrt die eingefügten Zeilen. Und die Schlösser werden bis zum Ende der Transaktion gehalten, das ist nicht verhandelbar.

Eine viel bessere Frage wäre "wie kann ich die data während der Einsätze lesen?" und die Antwort ist natürlich, Snapshot-Isolation in Ihren Lesern zu verwenden .

Bitte füge "FOR LOCAL STATIC READ_ONLY FORWARD_ONLY" vor Cursor hinzu:

 DECLARE MY_CURSOR CURSOR FOR LOCAL STATIC READ_ONLY FORWARD_ONLY SELECT columnname... FROM table-name BEGIN TRANSACTION OPEN cursor FETCH NEXT FROM cursor INTO @i WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO BigTable () VALUES () WAITFOR DELAY '00:01:00'; FETCH NEXT FROM cursor INTO @i END COMMIT;