sql >> Database teknologi >  >> RDS >> Sqlserver

Forstå SQL Server LOCKS på SELECT-forespørgsler

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.



  1. SQL - HVIS FINDER OPDATERING ELLERS INDSÆT I

  2. Hvordan RandomBlob() virker i SQLite

  3. CRUD-drift med ASP.NET Core MVC, Entity Framework Core og SQL Server

  4. Sådan udføres rå SQL i SQLAlchemy