- Грязное чтение : чтение НЕКОММЕНТОВанных данных из другой транзакции
- Неповторяемые чтения : чтение данных COMMITTED из
UPDATE
запроса из другой транзакции
- Фантомное чтение : чтение данных COMMITTED из
INSERT
илиDELETE
запроса из другой транзакции
Примечание : операторы DELETE из другой транзакции также имеют очень низкую вероятность вызвать неповторяющиеся чтения в некоторых случаях. Это происходит, когда оператор DELETE, к сожалению, удаляет ту же строку, к которой обращалась ваша текущая транзакция. Но это редкий случай, и гораздо менее вероятно, что он произойдет в базе данных, содержащей миллионы строк в каждой таблице. Таблицы, содержащие данные транзакций, обычно имеют большой объем данных в любой производственной среде.
Также мы можем заметить, что ОБНОВЛЕНИЯ могут быть более частой работой в большинстве случаев использования, а не фактической ВСТАВКОЙ или УДАЛЕНИЯМИ (в таких случаях остается опасность только неповторяющихся чтений - фантомные чтения в этих случаях невозможны). Вот почему ОБНОВЛЕНИЯ обрабатываются иначе, чем INSERT-DELETE, и результирующая аномалия также называется по-разному.
Существует также дополнительная стоимость обработки, связанная с обработкой для INSERT-DELETE, а не просто с обработкой ОБНОВЛЕНИЙ.
- READ_UNCOMMITTED ничего не мешает. Это нулевой уровень изоляции
- READ_COMMITTED предотвращает только один, то есть Грязное чтение
- REPEATABLE_READ предотвращает две аномалии: грязное чтение и неповторяемое чтение
- SERIALIZABLE предотвращает все три аномалии: грязные чтения, неповторяющиеся чтения и фантомные чтения
Тогда почему бы просто не установить транзакцию SERIALIZABLE в любое время? Что ж, ответ на поставленный выше вопрос таков: настройка SERIALIZABLE делает транзакции очень медленными , чего мы опять не хотим.
Фактически потребление времени транзакции происходит в следующем размере:
SERIALIZABLE > REPEATABLE_READ > READ_COMMITTED > READ_UNCOMMITTED
Поэтому установка READ_UNCOMMITTED является самой быстрой .
Резюме
На самом деле нам нужно проанализировать сценарий использования и определить уровень изоляции, чтобы оптимизировать время транзакции, а также предотвратить большинство аномалий.
Обратите внимание, что базы данных по умолчанию имеют настройку REPEATABLE_READ.