sql >> Database >  >> RDS >> Sqlserver

Hoofdconcept van SQL Server-vergrendeling

In dit bericht bespreken we het SQL Server-vergrendelingsmechanisme en hoe u SQL Server-vergrendeling kunt bewaken met standaard dynamische beheerweergaven van SQL Server. Voordat we beginnen met het uitleggen van de SQL Server-vergrendelingsarchitectuur, laten we even de tijd nemen om te beschrijven wat de ACID-database (Atomicity, Consistentie, Isolatie en Duurzaamheid) is. De ACID-database kan worden uitgelegd als databasetheorie. Als een database relationele database wordt genoemd, moet deze voldoen aan de vereisten voor atoomkracht, consistentie, isolatie en duurzaamheid. Nu zullen we deze vereisten kort uitleggen.

Atomiciteit :Het weerspiegelt het principe van ondeelbaarheid dat we omschrijven als het belangrijkste kenmerk van het transactieproces. Een transactieblokkering kan niet onbeheerd worden achtergelaten. De helft van het resterende transactieblok veroorzaakt inconsistentie in de gegevens. Ofwel de hele transactie wordt uitgevoerd of de transactie keert terug naar het begin. Dat wil zeggen, alle wijzigingen die door de transactie zijn aangebracht, worden ongedaan gemaakt en worden teruggebracht naar hun vorige staat.

Consistentie :Er is een regel die de substructuur van de niet-deelbaarheidsregel bepaalt. Transactiegegevens moeten voor consistentie zorgen. Dat wil zeggen, als de bijwerkbewerking wordt uitgevoerd in een transactie, moeten ofwel alle resterende transacties worden uitgevoerd of moet de bijwerkbewerking worden geannuleerd. Deze gegevens zijn erg belangrijk in termen van consistentie.

Isolatie :Dit is een aanvraagpakket voor elke transactiedatabase. Wijzigingen die door een verzoekpakket worden aangebracht, moeten zichtbaar zijn voor een andere transactie voordat deze is voltooid. Elke transactie moet afzonderlijk worden verwerkt. Alle transacties moeten zichtbaar zijn voor een andere transactie nadat ze hebben plaatsgevonden.

Duurzaamheid: Transacties kunnen complexe bewerkingen met gegevens uitvoeren. Om al deze transacties te beveiligen, moeten ze bestand zijn tegen een transactiefout. Systeemproblemen die zich in SQL Server kunnen voordoen, moeten worden voorbereid en bestand zijn tegen stroomuitval, besturingssysteem of andere door software veroorzaakte fouten.

Transactie: Transactie is de kleinste stapel van het proces die niet in kleinere stukken kan worden verdeeld. Ook kunnen sommige transactieprocessen opeenvolgend worden uitgevoerd, maar zoals we hebben uitgelegd in het Atomiciteits-principe, zullen alle transactieblokken mislukken als zelfs maar één van de transacties mislukt.

Vergrendelen: Lock is een mechanisme om de consistentie van gegevens te waarborgen. SQL Server vergrendelt objecten wanneer de transactie start. Wanneer de transactie is voltooid, geeft SQL Server het vergrendelde object vrij. Deze vergrendelingsmodus kan worden gewijzigd op basis van het SQL Server-procestype en het isolatieniveau. Deze vergrendelingsmodi zijn:

Hiërarchie vergrendelen: SQL Server heeft een vergrendelingshiërarchie die vergrendelingsobjecten in deze hiërarchie verwerft. Een database bevindt zich bovenaan de hiërarchie en de rij bevindt zich onderaan. De onderstaande afbeelding illustreert de slothiërarchie van SQL Server.

Gedeelde (S)-sloten: Dit vergrendelingstype treedt op wanneer het object moet worden gelezen. Dit type slot veroorzaakt niet veel problemen.

Exclusieve (X) sloten: Wanneer dit type vergrendeling optreedt, gebeurt dit om te voorkomen dat andere transacties een vergrendeld object wijzigen of openen.

Update (U)-sloten: Dit slottype is vergelijkbaar met het exclusieve slot, maar heeft enkele verschillen. We kunnen de update-operatie in verschillende fasen verdelen:leesfase en schrijffase. Tijdens de leesfase wil SQL Server niet dat andere transacties toegang krijgen tot dit object. Om deze reden gebruikt SQL Server de updatevergrendeling.

Intentievergrendeling: De intentievergrendeling treedt op wanneer SQL Server de gedeelde (S) vergrendeling of exclusieve (X) vergrendeling wil verkrijgen op sommige van de bronnen lager in de vergrendelingshiërarchie. In de praktijk, wanneer SQL Server een vergrendeling op een pagina of rij verkrijgt, is de intentievergrendeling vereist in de tabel.

Na al deze korte uitleg zullen we proberen een antwoord te vinden op het herkennen van sloten. SQL Server biedt veel dynamische beheerweergaven om toegang te krijgen tot metrische gegevens. Om SQL Server-vergrendelingen te identificeren, kunnen we de sys.dm_tran_locks . gebruiken weergave. In deze weergave kunnen we veel informatie vinden over de momenteel actieve vergrendelingsbeheerbronnen.

In het eerste voorbeeld zullen we een demotabel maken die geen indexen bevat en proberen deze demotabel bij te werken.

CREATE TABLE TestBlock
(Id INT ,
Nm VARCHAR(100))

INSERT INTO TestBlock
values(1,'CodingSight')
In this step, we will create an open transaction and analyze the locked resources.
BEGIN TRAN
UPDATE TestBlock SET   Nm='NewValue_CodingSight' where Id=1
select @@SPID

Nu gaan we de weergave sys.dm_tran_lock controleren.

select * from sys.dm_tran_locks  WHERE request_session_id=74

Deze weergave geeft veel informatie over actieve vergrendelingsbronnen. Maar het is niet mogelijk om sommige gegevens in deze weergave te begrijpen. Om deze reden moeten we ons aansluiten bij de sys.dm_tran_locks weergave naar andere weergaven.

SELECT dm_tran_locks.request_session_id,
       dm_tran_locks.resource_database_id,
       DB_NAME(dm_tran_locks.resource_database_id) AS dbname,
       CASE
           WHEN resource_type = 'OBJECT'
               THEN OBJECT_NAME(dm_tran_locks.resource_associated_entity_id)
           ELSE OBJECT_NAME(partitions.OBJECT_ID)
       END AS ObjectName,
       partitions.index_id,
       indexes.name AS index_name,
       dm_tran_locks.resource_type,
       dm_tran_locks.resource_description,
       dm_tran_locks.resource_associated_entity_id,
       dm_tran_locks.request_mode,
       dm_tran_locks.request_status
FROM sys.dm_tran_locks
LEFT JOIN sys.partitions ON partitions.hobt_id = dm_tran_locks.resource_associated_entity_id
LEFT JOIN sys.indexes ON indexes.OBJECT_ID = partitions.OBJECT_ID AND indexes.index_id = partitions.index_id
WHERE resource_associated_entity_id > 0
  AND resource_database_id = DB_ID()
 and request_session_id=74
ORDER BY request_session_id, resource_associated_entity_id

In de bovenstaande afbeelding ziet u de vergrendelde bronnen. SQL Server verwerft het exclusieve slot in die rij. (RID :Een rij-ID die wordt gebruikt om een ​​enkele rij binnen een heap te vergrendelen) Tegelijkertijd verwerft SQL Server de exclusieve vergrendeling van de pagina en het TestBlock tafel. Het betekent dat een ander proces deze bron niet kan lezen totdat de SQL Server de vergrendelingen vrijgeeft. Dit is het basisvergrendelingsmechanisme in de SQL Server.

Nu zullen we enkele synthetische gegevens in onze testtabel invullen.

TRUNCATE TABLE 	  TestBlock
DECLARE @K AS INT=0
WHILE @K <8000
BEGIN
INSERT TestBlock VALUES(@K, CAST(@K AS varchar(10)) + ' Value' )
SET @[email protected]+1
 END
After completing this step, we will run two queries and check the sys.dm_tran_locks view.
BEGIN TRAN
 UPDATE TestBlock  set Nm ='New_Value' where Id<5000

In de bovenstaande query verkrijgt SQL Server de exclusieve vergrendeling op elke afzonderlijke rij. Nu zullen we een andere zoekopdracht uitvoeren.

BEGIN TRAN
 UPDATE TestBlock  set Nm ='New_Value' where Id<7000

In de bovenstaande query maakt SQL Server de exclusieve vergrendeling op de tafel, omdat SQL Server veel RID-vergrendelingen probeert te verkrijgen voor deze rijen die zullen worden bijgewerkt. Dit geval veroorzaakt veel bronnengebruik in de database-engine. Daarom verplaatst SQL Server deze exclusieve vergrendeling automatisch naar een hoger object dat zich in de vergrendelingshiërarchie bevindt. We definiëren dit mechanisme als Lock Escalation. Lock Escalation kan op tafelniveau worden gewijzigd.

ALTER TABLE XX_TableName
SET
(
	LOCK_ESCALATION = AUTO -- or TABLE or DISABLE
)
GO

Ik zou graag wat opmerkingen willen toevoegen over de escalatie van vergrendelingen. Als u een gepartitioneerde tabel heeft, kunnen we de escalatie naar partitieniveau instellen.

In deze stap zullen we een query uitvoeren die een vergrendeling creëert in de AdventureWorks HumanResources-tabel. Deze tabel heeft geclusterde en niet-geclusterde indexen.

BEGIN TRAN	
UPDATE 	  [HumanResources].[Department] SET Name='NewName' where DepartmentID=1

Zoals u in het onderstaande resultaatvenster kunt zien, verwerft onze transactie exclusieve vergrendelingen in de PK_Department_DepartmentID clusterindexsleutel en verwerft ook exclusieve vergrendelingen in de niet-geclusterde indexsleutel AK_Department_Name. Nu kunnen we deze vraag stellen:"Waarom vergrendelt SQL Server een niet-geclusterde index?"

De Naam kolom is geïndexeerd in de niet-geclusterde index AK_Department_Name en we proberen de Naam te wijzigen kolom. In dit geval moet SQL Server alle niet-geclusterde indexen in die kolom wijzigen. Het niet-geclusterde indexbladniveau omvat elke KEY-waarde die is uitgesorteerd.

Conclusies

In dit artikel hebben we de hoofdlijnen van het SQL Server-vergrendelingsmechanisme genoemd en het gebruik van sys.dm_tran_locks overwogen. De weergave sys.dm_tran_locks retourneert veel informatie over de momenteel actieve vergrendelingsbronnen. Als je googled, kun je veel voorbeeldvragen over deze weergave vinden.

Referenties

Handleiding voor SQL Server-transactievergrendeling en rijversies

SQL Server, vergrendelt object


  1. Zoek en vervang tekst in de hele tabel met behulp van een MySQL-query

  2. Tabeltype retourneren van een functie in PostgreSQL

  3. De vergeten toewijzingsoperator =en de alledaagse :=

  4. GROUP BY en geaggregeerde sequentiële numerieke waarden