8.5 Изолированность пользователей
В многопользовательских системах с одной базой данных одновременно могут работать несколько пользователей или прикладных программ. Предельной задачей системы является обеспечение изолированности пользователей, т.е. создание достоверной и надежной иллюзии того, что каждый из пользователей работает с БД в одиночку.
Стандарт SQL не предусматривает понятие блокировки для реализации сериализуемости транзакций. Вместо этого вводятся уровни изолированности пользователей, связанные с проблемами параллелизма транзакций. Этот подход обеспечивает различным производителям СУБД возможность реализовать требования изолированности произвольными способами. В стандарте SQL-92 определено четыре уровня изолированности:
1) READ UNCOMMITED - уровень незавершенного чтения;
2) READ COMMITED - уровень завершенного чтения;
3) REPEATABLE READ - уровень повторяемого чтения;
4) SERIALIZABLE - уровень способности к упорядочению, соответствующий протоколу сериализации транзакций.
Самый высокий четвертый уровень изолированности пользователей SERIALIZABLE - последовательное выполнение (используется по умолчанию). Этот уровень гарантирует предотвращение всех конфликтных ситуаций, но, соответственно, при нем наблюдается самая низкая степень параллелизма;
Уровень REPEATABLE READ - повторяющееся чтение. На этом уровне разрешено выполнение операторов INSERT, приводящих к конфликтной ситуации "фантомная вставка". Проблема "фантомной вставки" может быть решена алгоритмически исключением из алгоритма повторного выполнения запроса в одной транзакции. Этот уровень целесообразно использовать, если на выполняющиеся SQL-операторы не влияет добавление новых строк. Этот уровень не допускает пропавшие обновления, неповторяемое чтение, незафиксированные зависимости, однако проблема фантомов остается.
На уровне READ COMMITTED - фиксированное чтение - транзакция не имеет доступа к промежуточным результатам других транзакций, поэтому проблемы неаккуратного чтения данных не возникают. Остаются неразрешенными проблемы фантомов и неповторяемого чтения. Этот уровень позволяет получать разные результаты для одинаковых запросов, но только после фиксации транзакции, повлекшей изменение данных.
На самом низком уровне изолированности пользователей READ UNCOMMITTED - нефиксированное чтение - транзакция видит промежуточные и несогласованные данные, поэтому проблемы неаккуратного чтения, неповторяемого чтения и фантомов не разрешаются. Тем не менее, даже на самом низком уровне изолированности, СУБД предотвращает пропавшие обновления.
Таблица 8.7 - Уровни изолированности пользователей
Do'stlaringiz bilan baham: |