Грязные чтения, фантомные чтения и неповторяющиеся чтения

база данных MySQL

Недавно я читал "InnoDB Storage Engine Inside MySQL Technology". Различные концепции, упомянутые в нем, очень новы. Я слышал о грязном чтении, фантомном чтении и неповторяемом чтении раньше, но я мало знаю о концепции, так что я проверил это. примечание.

Особенности транзакций базы данных

Характеристики транзакций базы данных или ACID:

атомарность

Транзакция представляет собой атомарную единицу операции.Операции над базой данных в транзакции либо выполняются, либо не выполняются.

C Последовательный

Данные должны оставаться в согласованном состоянии как до, так и после начала транзакции, а целостность базы данных должна быть гарантирована. То есть данные должны соответствовать правилам базы данных.

я Изоляция

База данных позволяет нескольким параллельным коллегам по транзакциям работать с данными, изоляция гарантирует, что каждая транзакция не зависит друг от друга, а промежуточное состояние во время обработки транзакции невидимо для других транзакций, что предотвращает несогласованность данных. Может задаваться уровнем изоляции транзакций: включая незафиксированное чтение (Read uncommitted), чтение зафиксированное (read commit), повторяемое чтение (repeatable read) и сериализуемое (Serializable)

D Прочная стойкость

После того, как транзакция завершена, ее изменения в базе данных остаются постоянными и не будут потеряны даже в случае сбоя системы.

Уровень изоляции данных MySQL

Прежде всего, в MySQL есть четыре уровня изоляции: Read uncommttied (может читать незафиксированные данные), Read commited (может читать зафиксированные данные), Repeatable read (повторяемое чтение), Serializable (сериализуемый).

В InnoDB по умолчанию используется уровень Repeatable, и InnoDB использует стратегию, называемую блокировкой следующего ключа, чтобы избежать фантомов.

использоватьselect @@tx_isolation;Вы можете просмотреть уровень изоляции транзакций MySQL по умолчанию.

Различные уровни изоляции транзакций вызывают разные проблемы:

15352624354970.jpg

Грязное чтение, фантомное чтение, концепция неповторяемого чтения

грязное чтение

Так называемое грязное чтение относится к транзакции, обращающейся к незафиксированным данным другой транзакции, как показано на следующем рисунке:
15352625974682.png
Если сеанс 2 обновляет возраст до 10, но перед фиксацией сеанс 1 хочет получить возраст, то значение, которое он получит, будет значением до обновления. или если сессия 2 обновляет значение, но выполняет откат, а сеанс 1 по-прежнему получает 10. Это грязное чтение.

галлюцинации

Транзакция читается дважды, и количество полученных записей несовместимо:
15352627898696.png
На приведенном выше рисунке ясно показана эта ситуация.Поскольку новое значение вставляется между сеансом 1, два полученных данных различны.

неповторяемое чтение

Транзакция дважды считывает одну и ту же запись, и результаты противоречивы:

15352628823137.png
Поскольку данные были изменены в середине чтения, результаты, полученные во время запроса транзакции сеанса 1, не совпадают.

решение

Решением являются четыре уровня изоляции, упомянутые выше, они позволяют в наибольшей степени избежать возникновения трех вышеуказанных ситуаций:

Несанкционированное чтение

Также известен как Read Uncommitted: грязные чтения разрешены, но обновления не могут быть потеряны. Если транзакция уже начала запись данных, другая транзакция не может одновременно записывать данные, но позволяет другим транзакциям читать эту строку данных. Этот уровень изоляции может быть достигнут с помощью «монопольных блокировок записи».

Разрешение на чтение

Также известен как Read Committed: неповторяющиеся чтения разрешены, но грязные чтения запрещены. Этого можно добиться с помощью «временных общих блокировок чтения» и «монопольных блокировок записи». Транзакции, которые читают данные, позволяют другим транзакциям продолжать доступ к строке, но незафиксированные транзакции записи не позволяют другим транзакциям получить доступ к строке.

Повторяемое чтение

Повторяемое чтение: неповторяющиеся и грязные чтения запрещены, но иногда могут возникать фантомные данные. Этого можно добиться с помощью «общих блокировок чтения» и «эксклюзивных блокировок записи». Транзакции, которые считывают данные, запрещают транзакции записи (но разрешают транзакции чтения), а транзакции записи запрещают любые другие транзакции.

Сериализуемый

Сериализуемый: обеспечивает строгую изоляцию транзакций. Он требует, чтобы транзакции выполнялись последовательно, транзакции могут выполняться только одна за другой и не могут выполняться одновременно. Сериализация транзакций не может быть достигнута только с помощью «блокировок на уровне строк», и должны использоваться другие механизмы, чтобы гарантировать, что вновь вставленные данные не будут доступны для транзакции, которая только что выполнила операцию запроса.

Чем выше уровень изоляции, тем лучше можно гарантировать целостность и согласованность данных, но тем больше влияние на параллельную производительность. Для большинства приложений предпочтительнее установить уровень изоляции системы базы данных на Read Committed. Он избегает грязных чтений и имеет хорошую производительность параллелизма. Хотя это может привести к проблемам параллелизма, таким как неповторяющееся чтение, фантомное чтение и второстепенные потерянные обновления, в отдельных случаях, когда такие проблемы могут возникать, приложение может управлять ими с помощью пессимистической блокировки или оптимистической блокировки.

Ссылаться на