En SELECT
i SQL Server vil placere en delt lås på en tabelrække - og en anden SELECT
ville også kræve en delt lås, og disse er kompatible med hinanden.
Så ingen - SELECT
kan ikke blokere en anden SELECT
.
Hvad er WITH (NOLOCK)
forespørgselstip, der bruges til, er at kunne læse data, der er i færd med at blive indsat (af en anden forbindelse), og som ikke er blevet begået endnu.
Uden det forespørgselstip, en SELECT
kan være blokeret for at læse en tabel af en igangværende INSERT
(eller UPDATE
) erklæring, der placerer en eksklusiv lås på rækker (eller muligvis en hel tabel), indtil den pågældende operations transaktion er blevet begået (eller rullet tilbage).
Problem med WITH (NOLOCK)
tip er:du læser muligvis datarækker, der slet ikke vil blive indsat i sidste ende (hvis INSERT
transaktion rulles tilbage) - så din f.eks. rapporten viser muligvis data, der aldrig rigtig er blevet forpligtet til databasen.
Der er et andet forespørgselstip, der kan være nyttigt - WITH (READPAST)
. Dette instruerer SELECT
kommando for bare at springe over alle rækker, som den forsøger at læse, og som udelukkende er låst. SELECT
vil ikke blokere, og den vil ikke læse nogen "beskidte" ukommitterede data - men den kan springe nogle rækker over, f.eks. ikke vise alle dine rækker i tabellen.