Введение
Понятие целостности транзакций базы данных
В системах баз данных изоляция является одним из свойств транзакций ACID (Atomicity, Consistency, Isolation, Durability). Она определяет, как изменения, вносимые транзакцией, видны другим пользователям и системам. Более низкий уровень изоляции повышает возможность одновременного доступа множества пользователей к одним и тем же данным, но также увеличивает вероятность возникновения эффектов параллелизма (таких как "грязное чтение" или потерянные обновления). Напротив, более высокий уровень изоляции снижает вероятность возникновения эффектов параллелизма, но требует больше системных ресурсов и увеличивает вероятность блокировки одной транзакции другой.
Контроль совпадения СУБД
Контроль за одновременным обращением включает в себя базовые механизмы в СУБД, обеспечивающие изоляцию и гарантирующие связанную с ней корректность. Он активно используется как самой базой данных, так и подсистемами хранения данных для обеспечения корректного выполнения параллельных транзакций, а также (с помощью различных механизмов) – корректности других процессов СУБД. Механизмы, связанные с транзакциями, обычно ограничивают последовательность операций доступа к данным базы данных (планы транзакций) определенными порядками, характеризующимися свойствами сериализуемости и восстановления. Ограничение порядка выполнения операций доступа к базе данных обычно приводит к снижению производительности (измеряемой скоростью выполнения), поэтому механизмы контроля одновременного обращения обычно разрабатываются для обеспечения максимально возможной производительности при заданных ограничениях. Часто, когда это возможно без ущерба для корректности, свойство сериализуемости приносится в жертву для повышения производительности. Однако от свойства восстановления отказываться нельзя, поскольку это обычно быстро приводит к нарушению целостности базы данных. Двухфазная блокировка – наиболее распространенный метод контроля одновременного обращения транзакций в СУБД, используемый для обеспечения как сериализуемости, так и восстановления, что гарантирует корректность. Чтобы получить доступ к объекту базы данных, транзакции сначала необходимо получить блокировку на этот объект. В зависимости от типа операции доступа (например, чтение или запись объекта) и типа блокировки, получение блокировки может быть заблокировано и отложено, если другая транзакция уже удерживает блокировку на этот объект.
Изоляция на стороне клиента
Изоляция обычно обеспечивается на уровне базы данных. Однако для этого также могут использоваться различные клиентские системы. Управление ею может осуществляться в прикладных фреймворках или средах выполнения, таких как J2EE Entity Beans.
Уровни изоляции
Из четырех свойств ACID в СУБД (системе управления базами данных) свойство изоляции ослабляется чаще всего. При попытке обеспечить максимальный уровень изоляции, СУБД обычно устанавливает блокировки на данные, что может привести к снижению параллельности, или реализует многоверсионное управление конкурентным доступом. Это требует добавления логики в приложение для его корректной работы. Большинство СУБД предлагают несколько уровней изоляции транзакций, которые определяют степень блокировки при выборке данных. Для многих приложений баз данных большинство транзакций можно построить таким образом, чтобы избежать необходимости в высоких уровнях изоляции (например, SERIALIZABLE), тем самым снижая накладные расходы на блокировку системы. Программисту необходимо тщательно анализировать код доступа к базе данных, чтобы убедиться, что любое снижение уровня изоляции не вызовет трудноуловимых ошибок в программном обеспечении. В то же время, использование более высоких уровней изоляции повышает вероятность возникновения взаимоблокировок (deadlock), что также требует внимательного анализа и применения соответствующих методов программирования для их предотвращения. Поскольку каждый уровень изоляции сильнее предыдущего, то есть более высокий уровень не допускает операций, запрещенных более низким, стандарт разрешает СУБД выполнять транзакцию на уровне изоляции, превышающем запрошенный (например, транзакция "Read committed" может фактически выполняться на уровне изоляции "Repeatable read"). Уровни изоляции, определенные стандартом ANSI/ISO SQL, перечислены ниже.
Повторяющиеся считывания
На этом уровне изоляции реализация СУБД с управлением параллелизмом на основе блокировок удерживает блокировки чтения и записи (полученные на выбранные данные) до конца транзакции. Однако управление блокировками диапазонов не осуществляется, поэтому возможны фантомные чтения. На этом уровне изоляции в некоторых системах возможно возникновение аномалии "искажение при записи". Искажение при записи – это ситуация, когда две транзакции могут одновременно изменить одни и те же столбцы в таблице (при этом каждая из них предварительно прочитала эти столбцы), что приводит к смешению данных из обеих транзакций в конечном значении столбца.
Читаем " подтверждено "
На этом уровне изоляции реализация СУБД с управлением параллельным доступом на основе блокировок удерживает блокировки записи (полученные на выбранные данные) до конца транзакции, но блокировки чтения снимаются сразу после выполнения операции SELECT (поэтому на этом уровне изоляции может возникнуть эффект неповторяющихся чтений). Как и на предыдущем уровне, управление блокировками диапазонов не осуществляется. Проще говоря, Read Committed – это уровень изоляции, который гарантирует, что любые прочитанные данные были зафиксированы на момент чтения. Он просто не позволяет читателю видеть промежуточные, незафиксированные, "грязные" данные. Никаких гарантий относительно того, что повторное выполнение чтения вернет те же данные, не дается; данные могут изменяться после их прочтения.
Читать без обязательств
Это самый низкий уровень изоляции. На этом уровне разрешены "грязные чтения", поэтому одна транзакция может видеть изменения, ещё не зафиксированные другими транзакциями.