qcha / JBook

Алгоритмы, паттерны, подготовка к собеседованиям, статьи и материалы по Java
733 stars 113 forks source link

Interview: Уровни изолированности транзакций #276

Open aarexer opened 3 weeks ago

aarexer commented 3 weeks ago

Расположить в interview/questions/medium/trx_isolations.md

Какие существуют уровни изолированности транзакций? В порядке увеличения изолированности транзакций и, соответственно, надёжности работы с данными:

Чтение неподтверждённых данных (грязное чтение) (read uncommitted, dirty read) — чтение незафиксированных изменений как своей транзакции, так и параллельных транзакций. Нет гарантии, что данные, изменённые другими транзакциями, не будут в любой момент изменены в результате их отката, поэтому такое чтение является потенциальным источником ошибок. Невозможны потерянные изменения, возможны неповторяемое чтение и фантомы. Чтение подтверждённых данных (read committed) — чтение всех изменений своей транзакции и зафиксированных изменений параллельных транзакций. Потерянные изменения и грязное чтение не допускается, возможны неповторяемое чтение и фантомы. Повторяемость чтения (repeatable read, snapshot) — чтение всех изменений своей транзакции, любые изменения, внесённые параллельными транзакциями после начала своей, недоступны. Потерянные изменения, грязное и неповторяемое чтение невозможны, возможны фантомы. Упорядочиваемость (serializable) — результат параллельного выполнения сериализуемой транзакции с другими транзакциями должен быть логически эквивалентен результату их какого-либо последовательного выполнения. Проблемы синхронизации не возникают.

Какие проблемы могут возникать при параллельном доступе с использованием транзакций? При параллельном выполнении транзакций возможны следующие проблемы:

Потерянное обновление (lost update) — при одновременном изменении одного блока данных разными транзакциями одно из изменений теряется; «Грязное» чтение (dirty read) — чтение данных, добавленных или изменённых транзакцией, которая впоследствии не подтвердится (откатится); Неповторяющееся чтение (non-repeatable read) — при повторном чтении в рамках одной транзакции ранее прочитанные данные оказываются изменёнными; Фантомное чтение (phantom reads) — одна транзакция в ходе своего выполнения несколько раз выбирает множество записей по одним и тем же критериям. Другая транзакция в интервалах между этими выборками добавляет или удаляет записи или изменяет столбцы некоторых записей, используемых в критериях выборки первой транзакции, и успешно заканчивается. В результате получится, что одни и те же выборки в первой транзакции дают разные множества записей. Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы: