READ COMMITTED & REPEATABLE READ

Транзакции и обработка ошибок в SQL Server

Miriam Antona

Software Engineer

READ COMMITTED

  • Уровень изоляции по умолчанию
  • Нельзя читать данные, изменённые другой транзакцией, которая ещё не зафиксирована и не откатана
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Транзакции и обработка ошибок в SQL Server

READ COMMITTED — сравнение уровней изоляции

Грязные чтения Неповторяемые чтения Фантомные чтения
READ UNCOMMITTED да да да
READ COMMITTED нет да да
Транзакции и обработка ошибок в SQL Server

READ COMMITTED — предотвращение грязных чтений

Исходный баланс счёта 5 = $35 000

Транзакция 1

BEGIN TRAN
  UPDATE accounts
  SET current_balance = 30000
  WHERE account_id = 5;

Транзакция 2

...

...

...

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;

Ожидает!

Транзакции и обработка ошибок в SQL Server

READ COMMITTED — предотвращение грязных чтений

Исходный баланс счёта 5 = $35 000

Транзакция 1

BEGIN TRAN
  UPDATE accounts
  SET current_balance = 30000
  WHERE account_id = 5;

COMMIT TRAN;

Транзакция 2

...

...

...

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00        |
Транзакции и обработка ошибок в SQL Server

READ COMMITTED — выборка без ожидания

Транзакция 1

BEGIN TRAN
  SELECT current_balance
  FROM accounts WHERE account_id = 5;

Транзакция 2

...

...

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00        |
Транзакции и обработка ошибок в SQL Server

READ COMMITTED — итоги

Преимущества:

  • Предотвращает грязные чтения

Недостатки:

  • Допускает неповторяемые и фантомные чтения
  • Транзакция может быть заблокирована другой транзакцией

Когда использовать?:

  • Когда нужно читать только зафиксированные данные, не беспокоясь о неповторяемых и фантомных чтениях
Транзакции и обработка ошибок в SQL Server

REPEATABLE READ

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
  • Нельзя читать незафиксированные данные других транзакций
  • Если данные были прочитаны, другие транзакции не могут их изменить до завершения транзакции REPEATABLE READ
Транзакции и обработка ошибок в SQL Server

REPEATABLE READ — сравнение уровней изоляции

Грязные чтения Неповторяемые чтения Фантомные чтения
READ UNCOMMITTED да да да
READ COMMITTED нет да да
REPEATABLE READ нет нет да
Транзакции и обработка ошибок в SQL Server

REPEATABLE READ — предотвращение неповторяемых чтений

Транзакция 1

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
    SELECT current_balance FROM accounts
    WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00        |

Транзакция 2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

Ожидает!

Транзакции и обработка ошибок в SQL Server

REPEATABLE READ — предотвращение неповторяемых чтений

Транзакция 1

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
    SELECT current_balance FROM accounts
    WHERE account_id = 5;
    SELECT current_balance FROM accounts
    WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00        |
COMMIT TRAN

Транзакция 2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

Ожидает!

Транзакции и обработка ошибок в SQL Server

REPEATABLE READ — предотвращение неповторяемых чтений

Транзакция 1

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
    SELECT current_balance FROM accounts
    WHERE account_id = 5;
    SELECT current_balance FROM accounts
    WHERE account_id = 5;
COMMIT TRAN

Транзакция 2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
(1 rows affected)
Транзакции и обработка ошибок в SQL Server

REPEATABLE READ — итоги

Преимущества:

  • Защищает читаемые данные от изменений другими транзакциями, предотвращает неповторяемые чтения
  • Предотвращает грязные чтения

Недостатки:

  • Допускает фантомные чтения
  • Транзакция может быть заблокирована транзакцией REPEATABLE READ.

Когда использовать?:

  • Когда нужно читать только зафиксированные данные и не допускать их изменения другими транзакциями. Фантомные чтения при этом допустимы
Транзакции и обработка ошибок в SQL Server

Давайте потренируемся!

Транзакции и обработка ошибок в SQL Server

Preparing Video For Download...