sql >> Database >  >> RDS >> Sqlserver

Gelijktijdigheid van transacties beheren met vergrendelingen in SQL Server

In een omgeving met meerdere gebruikers is het essentieel om de gelijktijdigheid van truncatie te behouden. Deze sloten zijn in-memory structuren van 96 bytes groot. Hun rol is het handhaven van de gegevensintegriteit, consistentie en gelijktijdigheidscontrole voor elke transactie. SQL Server volgt de ACID-test voor elke transactie.

  • A tomiciteit:deze eigenschap zorgt ervoor dat een transactie waarbij twee of meer processen zijn betrokken, volledig wordt vastgelegd, of dat geen van de processen wordt doorgevoerd.
  • C onssistentie:het geeft u een garantie over de vastgelegde transactiestatus. Een transactie moet ofwel een nieuwe staat van gegevens creëren of terugkeren naar de bestaande (vóór de transactie) staat.
  • Ik Solation:Het geeft aan dat transacties van elkaar geïsoleerd zijn. Als een transactie wordt uitgevoerd en er geen gegevens zijn vastgelegd, is deze geïsoleerd van andere transacties.
  • D urabiliteit:de duurzaamheid zorgt ervoor dat uw vastgelegde gegevens nooit verloren gaan. Het voorkomt stroom- en besturingssysteemstoringen of andere door software veroorzaakte fouten.

Om ACID-eigenschappen te garanderen, legt SQL Server verschillende soorten vergrendelingen op de objecten op. In dit geval moeten andere transacties wachten tot het slot wordt vrijgegeven.

Vergrendelingsmodi

SQL Server gebruikt de volgende vergrendelingsmodi voor elke transactie.

  • Gedeelde sloten:
    • In deze vergrendeling stelt SQL Server andere sessies in staat om de geselecteerde bewerkingen voor het lezen van gegevens uit te voeren. Het verhindert echter updates totdat het slot actief is.
    • Meerdere transacties kunnen tegelijkertijd een gedeelde vergrendeling op een rij of pagina opleggen.
    • Het is een algemeen slot dat u op uw database-objecten ziet.

In de volgende T-SQL halen we de klantrecord op voor een specifieke klant-ID. Verder gebruiken we dynamische beheerweergave sys.dm_tran_locks om de bestaande vergrendelingen te controleren.

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (HOLDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK

Zoals hieronder wordt getoond, heeft het een gedeelde vergrendeling op de gegeven resource-ID (8194443284a0):

  • Exclusieve (X) sloten:
    • SQL Server gebruikt exclusieve vergrendeling (X) voor DML-bewerkingen (Verwijderen, Invoegen of Bijwerken), waarbij een rij- of paginagegevens moeten worden gewijzigd.
    • Het voorkomt dat andere gebruikers toegang krijgen tot de bron totdat er een slot is geplaatst.
    • SQL Server kan slechts één exclusieve vergrendeling op een pagina of rij hebben voor een transactie.

In dit voorbeeld willen we records bijwerken voor klant-ID 1. Daarom vereist SQL Server een exclusieve vergrendeling van de resource. Geen enkele andere transactie kan de exclusieve vergrendeling op deze bron verkrijgen totdat de transactie is voltooid.

BEGIN TRAN
UPDATE [SalesLT].[Customer] 
SET Suffix='Mr.'  
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Update (U) sloten:
    • Het Update-slot is vergelijkbaar met een exclusief slot. Het kan worden geplaatst op een record met een gedeeld slot.
    • De updatevergrendeling plaatst een andere gedeelde vergrendeling op een specifieke rij. Zodra het de records kan wijzigen, converteert SQL Server de updatevergrendeling naar een exclusieve vergrendeling.
    • SQL Server kan geen gedeelde vergrendeling plaatsen op een bron met een Update-vergrendeling.
    • Je kunt ook WITH UPDLOCK gebruiken om een ​​updatevergrendeling te forceren.

Het volgende voorbeeld toont een updatevergrendeling op de resource-ID (8194443284a0):

BEGIN TRAN
SELECT * FROM [SalesLT].[Customer] WITH (UPDLOCK)
WHERE CustomerID=1
    
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'

ROLLBACK
  • Intentie vergrendelt:
    • Het doel is om een ​​transactie te informeren over het voornemen om een ​​slot te verwerven. Het komt voor wanneer een transactie een gedeelde of exclusieve vergrendeling vereist op de bronnen lager in de hiërarchie.
    • De transactie staat niet toe dat andere transacties een exclusief slot op de tafel krijgen met behulp van een intentieslot.
    • Typen intentievergrendelingen staan ​​hieronder.
      • Intent Shared (IS) lock:het geeft de intentie van SQL Server aan om bronnen in een lagere hiërarchie te lezen door individueel gedeelde lock te verkrijgen op die bronnen in een lagere hiërarchie.
      • Intent Exclusive (IX) lock:Het geeft de intentie van SQL Server aan om bronnen in een lagere hiërarchie te wijzigen door een exclusieve lock op die bronnen in een lagere hiërarchie te verkrijgen.
      • Een intentie-updatevergrendeling (IU):deze kan alleen op paginaniveau worden verkregen voor lagere hiërarchische bronnen, en zodra de update is voltooid, wordt deze omgezet in IX-vergrendeling.

Zoals hieronder wordt weergegeven, heeft de transactie een exclusieve vergrendeling op een sleutel en een exclusieve vergrendeling op paginaniveau.

Conversievergrendelingen

SQL Server converteert vergrendelingstypen om meerdere query's in een transactie te ondersteunen. Deze sloten staan ​​bekend als conversiesloten.

  • SIX – Shared with Intent Exclusieve vergrendeling:de SQL Server-transactie heeft een gedeelde vergrendeling op meerdere pagina's en heeft een exclusieve op meerdere rijen vergrendelen.
  • SIU - De SQL Server-transactie heeft een gedeelde vergrendeling op verschillende pagina's en heeft een Update op meerdere rijen vergrendelen.
  • UIX- Update met exclusieve intentievergrendeling:de SQL Server-transactie heeft een updatevergrendeling op verschillende pagina's en heeft een exclusieve op meerdere rijen vergrendelen.

Schemavergrendelingen

SQL Server verwerft twee soorten schemavergrendelingen.

  • Schema stabiliteitsvergrendeling (Sch-S):deze vergrendeling wordt gebruikt wanneer schemaafhankelijke query's worden gecompileerd en het uitvoeringsplan wordt gegenereerd. Het Sch-S-slot blokkeert geen enkele toegang tot de objectgegevens.
  • Schema-wijzigingsvergrendeling (Sch-M):deze vergrendeling is het resultaat van een uitvoering van een DDL-query (Data Definition Language). SQL Server kan slechts één schemawijzigingsvergrendeling op een object hebben. U kunt een object met deze schemavergrendeling niet wijzigen.

In het onderstaande voorbeeld krijgen we zowel Sch-S- als Sch-M-vergrendelingen terwijl we een objectdefinitie wijzigen.

BEGIN TRAN
Alter TABLE DemoTable ADD new bit
SELECT resource_type, request_mode, resource_description
FROM   sys.dm_tran_locks
WHERE  resource_type <> 'DATABASE'
ROLLBACK

Compatibiliteit vergrendelen

De vergrendelingscompatibiliteit is handig om toegestane vergrendelingen te controleren in het geval van meerdere transacties in dezelfde bron tegelijk. Als een transactie een vergrendeling plaatst, moet de nieuwe vergrendeling die door een andere transactie is geplaatst daarmee compatibel zijn. Daarom kunt u de volgende compatibiliteitslijst voor sloten doorlopen en ondersteunde sloten vinden tijdens meerdere transacties.

Escalaties vergrendelen

SQL Server heeft een vergrendelings-escalatiefunctie geïntroduceerd om te voorkomen dat er te veel vergrendeling plaatsvindt die geheugendruk zou kunnen veroorzaken. SQL Server houdt dynamisch rekening met het aantal vergrendelingen dat wordt vastgehouden op een bepaalde scan en het aantal vergrendelingen dat wordt vastgehouden door de hele transactie en het geheugen. SQL Server zet vergrendelingen op laag niveau om in vergrendelingen op hoog niveau bij escalatie van vergrendelingen. Het converteert bijvoorbeeld rijvergrendelingen naar vergrendelingen op paginaniveau.

Het gebruikt de volgende drempel voor escalaties van vergrendelingen.

  • Geheugendrempel: De drempelwaarde voor het slotgeheugen is ingesteld op 40 procent van het slotgeheugen.
  • Drempel vergrendelen: Als het aantal vergrendelingen dat is verkregen in de huidige tabel of index groter is dan 5000, kunnen vergrendelingsescalaties worden geactiveerd.

Gebruikers kunnen escalaties van vergrendelingen beheren met behulp van de instructie alter table. U kunt de vergrendelingsescalatie voor die tabel volledig uitschakelen met een parameterwaarde UITSCHAKELEN.

ALTER TABLE Table_name SET (LOCK_ESCALATION = < TABLE | AUTO | DISABLE > –One of those options) GO

U kunt verwijzen naar Microsoft-documentatie om escalaties van vergrendelingen in detail te begrijpen.

Opmerking:u moet de vergrendelings-escalatie pas uitschakelen als deze grondig is getest in een lagere omgeving, en het wordt aanbevolen om deze alleen door ervaren DBA's te gebruiken.

Conclusie

Dit artikel geeft een gedetailleerd overzicht van SQL Server-vergrendelingen en DMV om de vergrendeling en het escalatieproces te bewaken. Vergrendelen is heel normaal gedrag in SQL Server, en u moet er bekend mee zijn om te begrijpen hoe meerdere transacties werken, waarbij consistente gegevens worden gesimuleerd en geleverd.


  1. Wat is het beste hulpmiddel om twee SQL Server-databases (schema en gegevens) te vergelijken?

  2. Verbinding maken met meerdere SQL-servers in één klik (geregistreerde serversgroep) - SQL Server / TSQL-zelfstudie, deel 5

  3. Oracle:Null- en niet-null-rijen tellen

  4. Is er een booleaans type in Oracle-databases?