Обеспечение целостности данных. Управление транзакциями в СУБД Oracle и SQL Server, страница 3

Практически все СУБД поддерживают подтвержденное чтение.

Oracle допускает следующие уровни изоляции транзакций: подтвержденное чтение (по умолчанию), сериализованный, а также только чтение (Read-only), который не является частью стандарта SQL2.

SQL Server поддерживает все четыре уровня изоляции, определенные стандартом SQL2. Подтвержденное чтение является уровнем изоляции по умолчанию.

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

для сеанса в SQL Server 200:

SET TRANSACTION ISOLATION LEVEL
{READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE}

для текущей транзакции в Oracle:

SET TRANSACTION ISOLATION LEVEL {READ COMMITTED | SERIALIZABLE}

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

Oracle разрешает эту проблему, используя различные типы блокировок и модель согласованности версий (тиражирование).

SQL Server 2000, в отличие от Oracle, не поддерживает тиражирование. Вместо этого приложения должны или использовать блокировки с различными уровнями изоляции, или допускать грязное чтение. Использование исключительно блокировок в SQL Server приводит к тому, что:

·  «читатели» ждут, пока «писатели» подтвердят изменения данных;

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

Таким образом, для системы, поддерживающей большое число одновременных пользователей, существенным является быстрое освобождение блокировок.

Механизм блокировок

Для управления совместным доступом к данным большинство СУБД используют механизм блокировок. Блокировки – это механизм, который предотвращает разрушающее взаимодействие между пользователями, обращающимися к данным.

Блокировки используются для достижения двух основных целей СУБД:

·  Согласованность данных – гарантируют, что данные, которые пользователь читает или изменяет, не будут изменены другим пользователем до тех пор, пока первый пользователь не завершит работу с ними

·  Целостность данных – гарантирует, что данные и структуры базы данных отображают все изменения, примененные к ним, в правильной последовательности

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

Блокировки выполняются автоматически сервером базы данных и не требуют вмешательства пользователей. Неявные блокировки выполняются для SQL-утверждений, в зависимости от требуемых действий. Менеджер блокировок автоматически блокирует табличные данные на уровне строки, что минимизирует соперничество за одни и те же данные, или на уровне таблицы. Существует несколько типов блокировок, в зависимости от типа операции, вызвавшей блокировку. Обычно используется два уровня блокирования: монопольные блокировки и разделяемые блокировки.

Разделяемая блокировка (share lock) предполагает максимальную степень параллелизма при доступе к данным. При таком типе блокировки несколько пользователей могут совместно использовать одни и те же ресурсы.

Монопольная блокировка (exclusive lock) предотвращает одновременное разделение тех же ресурсов. Если одна транзакция имеет монопольную блокировку какого-то ресурса, то никакая другая транзакция не может изменить или модифицировать этот ресурс до тех пор, пока блокировка не будет отменена.

SQL Server допускает получение ресурсом только одной монопольной блокировки или нескольких разделяемых, монопольная блокировка не может быть получена до тех пор, пока не будут освобождены все разделяемые, и наоборот.

В СУБД Oracle на один ресурс может быть получена одна монопольная блокировка и несколько разделяемых. Например, если три пользователя пытаются обновить одну и ту же строку, все трое получают разделяемую блокировку на таблицу, и только первый пользователь получает монопольную блокировку на изменяемую строку. Остальные два пользователя вынуждены ждать, пока не будет снята монопольная блокировка, полученная первой транзакцией. Такая возможность в Oracle существует благодаря поддержке тиражирования.

Тиражирование

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

Сервер базы данных Oracle поддерживает целостность чтения следующим образом:

·  гарантирует, что множество данных видимых SQL-утверждением, согласовано относительно одной точки во времени и не изменится во время выполнения утверждения (целостность чтения на уровне утверждения);

·  гарантирует, что «читатели» базы данных не ждут «писателей» или других «читателей» при доступе к одним и тем же фрагментам данных;

·  гарантирует, что «писатели» базы данных не ждут «читателей» тех же данных;