
- •Алгоритмы совместного доступа к базам данных
- •Конкуренция, параллельность и согласованность
- •Алгоритмы Oracle, обеспечивающие параллельность и согласованность
- •Транзакции и взаимовлияние
- •Потери изменений
- •Черновое чтение
- •Повторяемое и неповторяемое чтение
- •Уровни изоляции
- •Isolation level read committed;
- •Алгоритмы блокирования Oracle
- •Автоматическое и явное блокирование
- •Уровни блокировок
- •Разделяемые блокировки
- •Исключающие блокировки
- •Блокировки dml
- •Строчные блокировки
- •Табличные блокировки
- •In exclusive mode
- •Повышение блокировок
- •Запросы и блокирование
- •Блокировки ddl
- •Исключающие блокировки ddl
- •Разделяемые блокировки ddl
- •Блокировки синтаксического анализа
- •Внутренние фиксаторы
- •Многовариантность
- •Системный номер изменения
- •Неблокирующие запросы
- •Многовариантность и согласованность чтения на уровне транзакций
- •Ошибки "слишком старый моментальный снимок"
- •Автоматическое функционирование системы
Транзакции и взаимовлияние
Взаимное влияние транзакций в многопользовательской системе базы данных может проявляться в виде: потерь изменений, чернового чтения, неповторяемого чтения и фантомов.
Потери изменений
Потеря изменения (lost update)происходит в том случае, когда двум транзакциям разрешается одновременно обновлять одни и те же данные. Для примера посмотрим, что случится, если двум транзакциям пользователей разрешить одновременно обновить таблицуPARTS. Одна операция обновления перезапишет результаты выполнения другой так, что одно из изменений будет потеряно. Для того чтобы предотвратить потерю изменений и другие отрицательные последствия влияния одной транзакции на другую, практически во всех системах баз данных применяются различные алгоритмы блокирования и упорядочения доступа к определенным наборам данных.
Черновое чтение
Черновое, или "грязное" чтение (dirty read)происходит в том случае, когда одна транзакция считывает незавершенные изменения, внесенные другой транзакцией. Предположим, что один из пользователей начинает транзакцию и модифицирует таблицуCUSTOMERS, изменяя адрес клиента. До того как этот пользователь завершает свою транзакцию, другой пользователь начинает новую, обращающуюся к таблицеCUSTOMERSс запросом. Если запрос восстанавливает модифицированный адрес клиента, это означает, что второй пользователь выполнил черновое чтение данных.
В большинстве случаев черновое чтение может создавать трудности для приложений, работающих с базой данных. Предположим, что запрос к таблице CUSTOMERSвыполняется до того, как изменен адрес клиента. После просмотра текущего адреса клиента пользователь обнаруживает, что необходимые изменения уже были внесены другой транзакцией, и не обновляет информацию. Однако пользователь не знает, что транзакция, которая модифицировала адрес клиента, продолжает выполняться, и позже она не завершается, а откатывается назад. В результате адрес клиента остается прежним. В этом примере пользователь принимает неверное решение на основании данных, полученных во время чернового чтения.
Повторяемое и неповторяемое чтение
Повторяемое чтение (repeatable read)происходит, если запрос, повторно выполняемый в одной транзакции, постоянно возвращает один и тот же набор данных и игнорирует изменения, вносимые другими незавершенными и завершенными транзакциями. Только после того как текущая транзакция заканчивается и начинается другая, в запросах становятся заметны результаты работы других завершенных транзакций.
И наоборот, неповторяемое чтение (non-repeatable read)происходит, когда запрос, несколько раз выполняемый в одной транзакции, выдает несогласованные данные в результате изменений, вносимых другими транзакциями.
ФАНТОМЫ.Фантомы - особый тип неповторяемого чтения. Фантом(phantom) –это строка, которая вводится во время неоднократного выполнения запроса в одной и той же транзакции и отмечается этим запросом. Предположим, что пользователь формирует запрос на отображение всех заказов, которые были размещены сегодня. Затем в той же транзакции он просит найти только новые заказы, которые были размещены с начала выполнения запроса. Фантомы могут приводить к возникновению проблем во время работы приложений, которые в одной транзакции вначале указывают набор строк, подлежащих обновлению, а затем выполняют анализ полученной информации до того, как все строки будут по очереди обновлены.