Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Управлявайте паралелността на транзакциите с помощта на заключвания в SQL Server

В многопотребителска среда е важно да се поддържа паралелност на съкращаването. Тези ключалки са структури в паметта с размер 96 байта. Тяхната роля е да поддържат целостта на данните, последователността, контрола на паралелността за всяка транзакция. SQL Server следва ACID теста за всяка транзакция.

  • A томичност:Това свойство гарантира, че транзакция, включваща два или повече процеса, е ангажирана изцяло или нито един от процесите не е ангажиран.
  • C onsistency:Дава ви гаранция за състоянието на извършената транзакция. Транзакцията трябва или да създаде ново състояние на данните, или да се върне към съществуващото (преди транзакцията) състояние.
  • I Solation:Показва, че транзакциите са изолирани една от друга. Ако дадена транзакция се изпълнява и в нея не са поети данни, тя е изолирана от други транзакции.
  • Г издръжливост:Издръжливостта гарантира, че вашите ангажирани данни никога не се губят. Предотвратява отказ на захранването и операционната система или други грешки, причинени от софтуера.

За да осигури свойствата на ACID, SQL Server налага различни видове ключалки върху обектите. В този случай другите транзакции трябва да изчакат, докато се освободи заключването.

Режими на заключване

SQL Server използва следните режими на заключване за всяка транзакция.

  • Споделени ключалки:
    • При това заключване SQL Server позволява на други сесии да изпълняват избраните операции за четене на данни. Въпреки това, той предотвратява актуализации, докато заключването не е активно.
    • Няколко транзакции могат да наложат споделено заключване едновременно на ред или страница.
    • Това е често срещано заключване, което виждате на обектите на вашата база данни.

В следващия T-SQL извличаме записа на клиента за конкретен клиентски идентификатор. Освен това използваме динамичен изглед за управление sys.dm_tran_locks, за да проверим съществуващите ключалки.

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

Както е показано по-долу, той има споделено заключване на дадения идентификатор на ресурса (8194443284a0):

  • Изключителни (X) ключалки:
    • SQL Server използва изключително заключване (X) за DML операции (Изтриване, Вмъкване или Актуализиране), изискващи промяна на данни за ред или страница.
    • Не позволява на други потребители да имат достъп до ресурса, докато не бъде поставено заключване.
    • SQL сървърът може да има само едно изключително заключване на страница или ред за транзакция.

В този пример искаме да актуализираме записи за идентификатор на клиента 1. Следователно SQL Server изисква изключително заключване на ресурса. Никоя друга транзакция не може да получи изключителното заключване на този ресурс, докато транзакцията не бъде завършена.

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
  • Актуализиране на ключалките (U):
    • Заключването за актуализиране е подобно на изключително заключване. Може да се постави в запис със споделено заключване.
    • Заключването на актуализацията поставя друго споделено заключване на конкретен ред. След като може да промени записите, SQL Server преобразува заключването за актуализиране в изключително заключване.
    • SQL сървърът не може да постави споделено заключване на ресурс със заключване за актуализиране.
    • Можете също да използвате WITH UPDLOCK за принудително заключване на актуализацията.

Следният пример показва заключване на актуализация на идентификатора на ресурса (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
  • Заключване на намерение:
    • Неговата цел е да информира транзакция за намерението й да придобие заключване. Това се случва, когато транзакция изисква споделено или изключително заключване на ресурсите по-ниско в йерархията.
    • Транзакцията не позволява на други транзакции да получат ексклузивно заключване на масата с помощта на заключване с намерение.
    • Типове заключвания за намерение са по-долу.
      • Заключване на споделено намерение (IS):Показва намерението на SQL Server да чете ресурси от по-ниска йерархия чрез придобиване на споделено заключване поотделно на тези ресурси от по-ниска йерархия.
      • Изключително намерение (IX) заключване:Показва намерението на SQL Server да модифицира ресурси от по-ниска йерархия, като получи изключително заключване на тези ресурси от по-ниска йерархия.
      • Заключване на актуализация с намерение (IU):Може да бъде придобито на ниво страница само за по-ниски йерархични ресурси и след като актуализацията завърши, тя се преобразува в IX заключване.

Както е показано по-долу, транзакцията има изключително заключване на ключ и има изключително заключване на намерение на ниво страница.

Заключване за преобразуване

SQL Server преобразува типовете заключване, за да поддържа множество заявки в транзакция. Тези ключалки са известни като ключалки за преобразуване.

  • ШЕСТ – Споделено с Intent Exclusive заключване:Транзакцията на SQL Server притежава споделено заключване на няколко страници и има изключително заключване на няколко реда.
  • SIU – транзакцията на SQL Server има споделено заключване на няколко страници и има актуализация заключване на няколко реда.
  • UIX – Актуализация с изключителна заключване на намерение:Транзакцията на SQL Server поддържа заключване за актуализиране на няколко страници и има Изключително заключване на няколко реда.

Заключване на схема

SQL Server придобива два вида заключвания на схеми.

  • Заключване на стабилност на схемата (Sch-S):Това заключване се използва, когато се компилира заявка в зависимост от схемата и нейният план за изпълнение се генерира. Заключването Sch-S не блокира никакъв достъп до данните за обекта.
  • Заключване на промяна на схемата (Sch-M):Това заключване е резултат от изпълнение на DDL (език за дефиниране на данни) заявка. SQL Server може да има само едно заключване за промяна на схемата на обект. Не можете да променяте обект с това заключване на схемата.

В примера по-долу получаваме както Sch-S, така и Sch-M ключалки, докато модифицираме дефиниция на обект.

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

Съвместимост на заключване

Съвместимостта на заключване е полезна за проверка на разрешените заключвания в случай на множество транзакции в един и същ ресурс едновременно. Ако транзакция постави заключване, новото заключване, поставено от друга транзакция, трябва да е съвместимо с нея. Следователно можете да преминете през следния списък за съвместимост на заключване и да намерите поддържани заключвания по време на множество транзакции.

Ескалиране на заключване

SQL Server въведе функция за ескалация на заключване, за да предотврати твърде много заключване, което може да причини напрежение в паметта. SQL Server отчита динамично броя на заключванията, държани при конкретно сканиране, и броя на заключванията, държани от цялата транзакция и памет. SQL Server преобразува заключвания от ниско ниво в заключвания на високо ниво при ескалация на заключване. Например, той преобразува заключванията на редове в заключвания на ниво страница.

Той използва следния праг за ескалация на заключване.

  • Праг на паметта: Прагът на паметта за заключване е зададен на 40 процента от паметта за заключване.
  • Праг на заключване: Ако броят на заключванията, придобити в текущата таблица или индекс, е по-голям от 5000, може да се задейства ескалиране на заключвания.

Потребителите могат да контролират ескалацията на заключване с помощта на оператора alter table. Можете напълно да деактивирате ескалацията на заключването за тази таблица, като използвате стойност на параметър DISABLE.

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

Можете да се обърнете към документацията на Microsoft за подробно разбиране на ескалациите на заключване.

Забележка:Не трябва да деактивирате ескалацията на заключване, докато не бъде щателно тествана в по-ниска среда и се препоръчва да се използва само от опитни администратори на данни.

Заключение

Тази статия дава подробен преглед на заключванията на SQL Server и DMV за наблюдение на заключването и неговия процес на ескалация. Заключването е съвсем нормално поведение в SQL Server и трябва да сте запознати с него, за да разберете как работят множество транзакции, симулирайки и предоставяйки последователни данни.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вземете текущия идентификатор за влизане в SQL Server (T-SQL)

  2. Защо да използвате клаузата INCLUDE, когато създавате индекс?

  3. Проверете дали съществува временна таблица и изтрийте дали съществува, преди да създадете временна таблица

  4. Създайте тригер „Вместо“ в SQL Server

  5. Конструирайте дата от номер на година и седмица в MSSQL