Коротка шпаргалка по блокуваннях при читанні і зміни даних в залежності від рівня ізоляції транзакції в MSSQL

Read Uncommitted

  • якщо в одній транзакції поміняти дані — селект цих даних (в іншої транзакції або без транзакції) не будуть чекати закінчення першої транзакції і повернуть записані дані незакомиченных транзакцій
  • якщо в одній транзакції вважати дані — апдейти цих даних до іншої транзакції не будуть чекати закінчення першої транзакції
  • шаред локі не використовуються. Що аналогічно установці NOLOCK хінта у всі селекты Read Commited
  • ексклюзивні локировки встановлюються в процесі виконання стейтменту і знімаються по закінченню транзакції


Read Committed + read_committed_snapshot off

(alter database xxx set read_committed_snapshot off)

  • якщо в одній транзакції поміняти дані — селект цих даних (в іншої транзакції або без транзакції) будуть чекати закінчення першої транзакції. Селект з NOLOCK хинтом поверне змінені, але не закомиченные дані.
  • якщо в одній транзакції вважати дані — апдейти цих даних до іншої транзакції не будуть чекати закінчення першої транзакції
  • шаред локировки встановлюються в процесі роботи стейтменту і знімаються по закінченню стейтменту
  • ексклюзивні локировки встановлюються в процесі виконання стейтменту і знімаються по закінченню транзакції




Read Committed + read_committed_snapshot on

(alter database xxx set read_committed_snapshot on)
  • якщо в одній транзакції поміняти дані — селект цих даних (в іншої транзакції або без транзакції) не будуть чекати закінчення першої транзакції і повернуть значення на момент старту стейтменту. Селект з NOLOCK хинтом поверне змінені, але не закомиченные дані.
  • якщо в одній транзакції вважати дані — апдейти цих даних до іншої транзакції не будуть чекати закінчення першої транзакції
  • шаред локировки не використовуються, замість цього використовується механізм Row Versioning — дані оновлених записів зберігаються в tempdb
  • ексклюзивні локировки встановлюються в процесі виконання стейтменту і знімаються по закінченню транзакції


Repeatable Read

  • якщо в одній транзакції поміняти дані — селект цих даних (в іншої транзакції або без транзакції) чекати закінчення першої транзакції. Селект з NOLOCK хинтом поверне змінені, але не закомиченные дані.
  • якщо в одній транзакції вважати дані — апдейти цих даних до іншої транзакції чекати закінчення першої транзакції
  • шаред локировки встановлюються в процесі роботи стейтменту і знімаються по закінченню транзакції на відміну від Read Commited
  • ексклюзивні локировки встановлюються в процесі виконання стейтменту і знімаються по закінченню транзакції


Serializable

  • якщо в одній транзакції поміняти дані — селект цих даних (в іншої транзакції або без транзакції) чекати закінчення першої транзакції. Селект з NOLOCK хинтом поверне змінені, але не закомиченные дані.
  • якщо в одній транзакції вважати дані — апдейт цих даних до іншої транзакції чекати закінчення першої транзакції
  • шаред локировки встановлюються в процесі роботи стейтменту і знімаються по закінченню транзакції
  • ексклюзивні локировки встановлюються в процесі виконання стейтменту і знімаються по закінченню транзакції
  • встановлюються ексклюзивні range локі на ключі, що попадають в діапазони критеріїв запиту, що забороняє робити инсерты нових записів, які потрапляють в ці діапазони, що аналогічно установці HOLDLOCK хінта у всі селекты Read Commited


Snapshot
(alter database xxx set allow_snapshot_isolation on)

  • якщо в одній транзакції поміняти дані — селект цих даних (в іншої транзакції або без транзакції) не будуть чекати закінчення першої транзакції і повернуть значення на момент старту транзакції. Селект з NOLOCK хинтом поверне змінені, але не закомиченные дані.
  • якщо в одній транзакції вважати дані — апдейти цих даних до іншої транзакції не будуть чекати закінчення першої транзакції
  • шаред локировки не використовуються, замість цього використовується механізм Row Versioning — дані оновлених записів зберігаються в tempdb
  • ексклюзивні локировки встановлюються в процесі виконання стейтменту і знімаються по закінченню транзакції


Перевірялося на MSSQL 2014.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.