Уровни изолированности транзакций
Материал из Википедии — свободной энциклопедии
Уровень изолированности транзакций — значение, определяющее уровень, при котором в транзакции допускаются несогласованные данные, то есть степень изолированности одной транзакции от другой. Более высокий уровень изолированности повышает точность данных, но при этом может снижаться количество параллельно выполняемых транзакций. С другой стороны, более низкий уровень изолированности позволяет выполнять больше параллельных транзакций, но снижает точность данных.
Содержание |
[править] Проблемы параллельного доступа с использованием транзакций
При параллельном использовании транзакций могут возникать следующие проблемы:
– потерянное обновление (lost update);
– «грязное» чтение (dirty read) — чтение данных, которые были записаны откатанной транзакцией;
– неповторяющееся чтение (non-repeatable read);
– фантомная вставка (phantom insert).
Рассмотрим ситуации, в которых возможно возникновение данных проблем.
[править] Потерянное обновление
Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
| Транзакция 1 | Транзакция 2 |
|---|---|
SELECT f2 FROM tbl1 WHERE f1=1; |
SELECT f2 FROM tbl1 WHERE f1=1; |
UPDATE tbl1 SET f2=20 WHERE f1=1; |
|
UPDATE tbl1 SET f2=25 WHERE f1=1; |
В транзакции 1 изменяется значение поля f2, а затем в транзакции 2 также изменяется значение этого поля. В результате изменение, выполненное первой транзакцией, будет потеряно.
[править] «Грязное» чтение
Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
| Транзакция 1 | Транзакция 2 |
|---|---|
SELECT f2 FROM tbl1 WHERE f1=1; |
|
UPDATE tbl1 SET f2=f2+1 WHERE f1=1; |
|
SELECT f2 FROM tbl1 WHERE f1=1; |
|
ROLLBACK WORK; |
В транзакции 1 изменяется значение поля f2, а затем в транзакции 2 выбирается значение этого поля. После этого происходит откат транзакции 1. В результате значение, полученное второй транзакцией, будет отличаться от значения, хранимого в базе данных.
[править] Неповторяющееся чтение
Предположим, имеются две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
| Транзакция 1 | Транзакция 2 |
|---|---|
SELECT f2 FROM tbl1 WHERE f1=1; |
SELECT f2 FROM tbl1 WHERE f1=1; |
UPDATE tbl1 SET f2=f2+1 WHERE f1=1; |
|
SELECT f2 FROM tbl1 WHERE f1=1; |
В транзакции 2 выбирается значение поля f2, затем в транзакции 1 изменяется значение поля f2. При повторной попытке выбора значения из поля f2 в транзакции 2 будет получен другой результат. Эта ситуация особенно неприемлема, когда данные считываются с целью их частичного изменения и обратной записи в базу данных.
[править] Фантомная вставка
Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
| Транзакция 1 | Транзакция 2 |
|---|---|
SELECT SUM(f2) FROM tbl1; |
|
INSERT INTO tbl1 (f1,f2) VALUES (15,20); |
|
SELECT SUM(f2) FROM tbl1; |
В транзакции 2 выполняется SQL-оператор, использующий все значения поля f2. Затем в транзакции 1 выполняется вставка новой строки, приводящая к тому, что повторное выполнение SQL-оператора в транзакции 2 выдаст другой результат. Такая ситуация называется фантомной вставкой и является частным случаем неповторяющегося чтения. При этом, если выполняемый SQL-оператор выбирает не все значения поля f2, а только значение одной строки таблицы (используется предикат WHERE), то выполнение оператора INSERT не приведет к ситуации фантомной вставки.
[править] Уровни изоляции
Стандарт SQL-92 определяет уровни изоляции, установка которых предотвращает определенные конфликтные ситуации. Введены следующие четыре уровня изоляции:
[править] Serializable (упорядочиваемость)
Самый высокий уровень изолированности; транзакции полностью изолируются друг от друга. На этом уровне результаты параллельного выполнения транзакций для базы данных совпадают с последовательным выполнением тех же транзакций (по очереди в каком-либо порядке).
[править] Repeatable read (повторяемость чтения)
Уровень, при котором чтение одной и той же строки или строк в транзакции дает одинаковый результат. (Пока транзакция не завершена, никакие другие транзакции не могут модифицировать эти данные.)
[править] Read committed (чтение фиксированных данных)
Принятый по умолчанию уровень для SQL Server. Завершенное чтение, при котором отсутствует черновое, "грязное" чтение.(т.е. чтение одним пользователем данных, которые не были зафиксированны в БД командой COMMIT) Тем не менее в процессе работы одной транзакции другая может быть успешно завершена и сделанные ею изменения зафиксированы. В итоге первая транзакция будет работать с другим набором данных. Это проблема неповторяемого чтения.
[править] Read uncommitted (чтение незафиксированных данных)
Низший уровень изоляции, соответствующий уровню 0. Он гарантирует только физическую целостность данных: если несколько пользователей одновременно изменяют одну и ту же строку, то в окончательном варианте строка будет иметь значение, определенное пользователем, последним изменившим запись, а не смешанные значения столбцов отдельных пользователей (повреждение данных). По сути, для транзакции не устанавливается никакой блокировки, которая гарантировала бы целостность данных.
[править] Поведение при различных уровнях изолированности
«+» — предотвращает, «–» — не предотвращает.
| Уровень изоляции | Фантомная вставка | Неповторяющееся чтение | «Грязное» чтение | Потерянное обновление |
|---|---|---|---|---|
| SERIALIZABLE | + | + | + | + |
| REPEATABLE READ | – | + | + | + |
| READ COMMITED | – | – | + | + |
| READ UNCOMMITTED | – | – | – | + (?) |
Для улучшения этой статьи желательно?:
|

