Теория и практика построения баз данных (1088289), страница 97
Текст из файла (страница 97)
Невозможны вставка, обновление или удаление Не рекомендуются Сериализуемость только чтение Явные блокировки Сначала записывается значение БСХ, имевшее место в момент запуска оператора. Назовем это значение зСХ оператора. При обработке запроса, в данном случае при поиске строк, в которых МУСо!цгпп2 = 'Что-нибудь', Огас1е выберет только те строки, которые содержат завершенные изменения с ВСХ, меньшим или равным ЯСХ оператора.
Если Огас1е находит строку с завершенным изменением, ЯСХ которой превышает ЯСХ оператора, она ищет в сегменте отката версию этой строки с завершенным изменением, ЯСХ которой меньше, чем ЯСХ оператора. При таком способе обработки ЯЯ).-операторы всегда считывают согласованный набор значений — те значения, которые были записаны до или в момент запуска оператора. Как вы увидите, эта стратегия иногда применяется и к транзакциям. В атом случае все операторы в транзакции считывают строки, ВСХ которых не превышает значение ЯСХ, имевшее место на момент начала транзакции. Обратите внимание, что Огас1е считывает только завершенные изменения, Следовательно, «грязное» чтение невозможно.
Огас1е поддерживает три уровня изоляции транзакций: «завершенное чтение», «сериализуемость» и «только чтение» (геас! оп1у). Первые два уровня изоляции определены в стандарте АХ51 1992 г., а уровень «только чтение» является уникальным для Огас1е. В табл. 12.3 приведена характеристика этих уровней изоляции. Уровень изоляции «завершенное чтение» Вспомните из главы 11, что при уровне изоляции «завершенное чтение» «грязное» чтение невозможно, однако чтение может быть невоспроизводимым, и могут возникать фантомы.
«Завершенное чтение» вЂ” ато уровень изоляции транзакций, применяемый в Огас!е по умолчанию, поскольку Огас1е никогда не считывает не- сохраненные изменения. При уровне изоляции «завершенное чтение» каждый оператор по отдельности согласован, но два различных оператора в одной и той же транзакции могут считать несогласованные данные. Это то же самое, что согласованность на уровне оператора, как опа определена в предыдущей главе. Если требуется согласованность на уровне транзакции, необходимо использовать уровень «сериализуемость». Однако не смешивайте согласованность на уровне оператора с проблемой потери обновления.
В Огас1е потерянные обновления невозможны, так как она никогда не читает «грязные» данные. Из-за того, как Огас1е использует ЯСХ, ей не требует.ся налагать блокировки при чтении. Но перел тем как изменить или удалить строку, Огас1е наложит на нее монопольную блокировку. Если другая транзакция наложила монопольную блокировку на данную строку, оператор будет ждать. Если наложившая блокировку транзакция откатывается, изменение или удаление выполняется. Если наложившая блокировку транзакция сохраняется в базе данных, то оператору передается новое значение ЯСХ, и сам оператор (а не транзакция) откатывается и запускается заново.
Когда происходит откат оператора, изменения, уже произведенные этим оператором, отменяются с помощью сегментов отката. Вследствие использования монопольных блокировок могут возникать ситуации взаимной блокировки. Когда такое происходит, Огас!е обнаруживает взаимную блокировку с помощью графа ожидания Стуа!г-Еог йтгар!т) и производит откат одного из вызвавших конфликт операторов. Уровень изоляции «сериализуемость» Как вы узнали нз главы 11, при уровне изоляции «сернализуемость» «грязное» чтение невозможно, чтение всегда является воспроизводимым, и фантомы возникать не могут.
Огас1е поддерживает этот уровень изоляции, но для его работы необходимо участие прикладной программы. Чтобы изменить уровень изоляции транзакции внутри самой транзакции, используйте команду 5еб Следующий оператор установит уровень изоляции «сериализуемосгь» на время выполнения транзакции: 5ЕТ ТЙАМ5АСТРЗМ 150САТ10М СЕУЕС 5Ей!АС)2ЯВСЕ; Чтобы изменить уровень изоляции для всех транзакций в сессии, воспользуйтесь командой АСТЕК: АСТЕЙ 5Е5З!ОМЗ 5ЕТ 1ЗССАТ!ОМ СЕУЕС ЗЕВ!АС12АВСЕ; Когда установлен уровень изоляции «сериалпзуемость», Огас1е сохраняет значение ЯСХ в момент запуска транзакции. Назовем это значение оСХ глратгзакции.
((Р()АТЕ МУТАВЕЕ 5ЕТ НуСо1ивп! - 'Новое Значение' ННЕйЕ НуСо!цвп2 = 'Что-нибудь'; Завершенное чтение Свриализувмость Только чтение Явные блокировки 454 Глава 12. Работа с базами данных в Огас(е Допустим, приложение выдает эО)=оператор вида Сначала записывается значение ЯСХ, имевшее место,в момент запуска оператора. Назовем это значение 5САг оператора. При обработке запроса, в данном случае при поиске строк, в которых г(уСо!цгпп2 'Что-нибудь', Огас!е выберет только те строки, которые содержат завершенные изменения с ЯСХ, меньшим или равным ЯСХ оператора. Если Огас)е находит строку с завершенным изменением, ЯСХ которой превышает ЯСХ оператора, она ищет в сегменте отката версию этой строки с завершенным изменением, ЯСХ которой меньше, чем ЯСХ оператора.
При таком способе обработки ВО(.-операторы всегда считывают согласованный набор значений — те значения, которые были записаны до или в момент запуска оператора. Как вы увидите, эта стратегия иногда применяется и к транзакциям. В этом случае все операторы в транзакции считывают строки, ВСХ которых не превьппает значение ЯСХ, имевшее место на момент начала транзакции.
Обратите внимание, что Огас1е считывает только завершенные изменения. Следовательно, «грязное» чтение невозможно. Огас1е поддерживает три уровня изоляции транзакций: «завершенное чтение», «сериализуемость» и «только чтение» Ггеаг! оп!у). Первые два уровня изоляции определены в стандарте АХЯ! 1992 г., а уровень «только чтение» является уникальным для Огас1е. В табл. 12.3 приведена характеристика этих уровней изоляции.
Таблица 12.3. Варианты управления параллельной обработкой в Огас(е Уровень изоляции Описание Уровень изоляции, используемый Огас(в по умолчанию. Грязное чтение невозможно, но повторное чтение можят дать различные результаты. Возможно возникновение фантомов. Каждый оператор считывает согласованныв данные. Когда налагается блокировка на обновление, операторы откатываются и запускаются вновь по необходимости. Взаимная блокировка обнаруживается, и один из операторов, вызвавших вв, откатывается «Грязное» чтение невозможно. Повторное чтение дает один и тот жв результат, фантомы невозможны. Всв операторы в транзакции считывают согласованные данные. Ошибка «Саппог Бвпаакв» («Невозможно свриализовать») возникает, когда транзакция пытается обновить или удалить строку с завершенным изменением, которов произошло после начала транзакции.
Кроме того, эта ошибка возникает, когда транзакции или операторы, налагающие блокировку, фиксируют свои изменения, а также когда транзакция откатывается вследствие взаимной блокировки. Обработку исключения «Саппо! Ьвпа((зв» необходимо производить в прикладных программах Всв операторы считывают согласованныв данные. Невозможны вставка, обновление или удаление Нв рекомендуются Управление параллельной обработкой 455 Уровень изоляции «завершенное чтение» Вспомните из главы 11, что при уровне изоляции «завершенное чтение» «грязное» чтение невозможно, однако чтение может быть невоспроизводимым, и могут возникать фантомы. «Завершенное чтение» вЂ” это уровень изоляции транзакций, применяемый в Огас1е по умолчанию, поскольку Огас!е никогда не считывает несохран енные из ме не н пя.
При уровне изоляции «завершенное чтение» каждый оператор по отдельности согласован, но два различных оператора в одной и той же транзакции могут считать несогласованные данные. Это то же самое, что согласованность на уровне оператора, как она определена в предыдутцей главе. Если требуется согласованность на уровне транзакции, необходимо использовать уровень «сериализуемость». Однако не смешивайте согласованность на уровне оператора с проблемой потери обновления.
В Огас1е потерянные обновления невозможны, так как она никогда не читает «грязные» данные. Из-за того, как Огас1е использует ВСХ, ей не требуется налагать блокировки при чтении. Но перед тем как изменить или удалить строку, Огас!е наложит на нее монопольную блокировку. Если другая транзакция наложила монопольную блокировку на данную строку, оператор будет ждать. Если наложившая блокировку транзакция откатывается, изменение или удаление выполняется.
Если наложившая блокировку транзакция сохраняется в базе данных, то оператору передается новое значение ЯСХ, и сам оператор (а не транзакция) откатывается и запускается заново. Когда происходит откат оператора, изменения, уже произведенные этим оператором, отменяются с помощью сегментов отката. Вследствие использования монопольных блокировок могут возникать ситуации взаимной блокировки. Когда такое происходит, Огас1е обнаруживает взаимную блокировку с помощью графа ожидания (ууа!с-Гог ягарЬ) и производит откат одного из вызвавших конфликт операторов. Уровень изоляции «сериализуемость» Как вы узнали из главы 11, при уровне изоляции «сериализуемость» «грязное» чтение невозможно, чтение всегда является воспроизводимым, и фантомы возникать не могут. Огас!е поддерживает атот уровень изоляции, но для его работы необходимо участие прикладной программы.
Чтобы изменить уровень изоляции транзакции внутри самой транзакции, используйте команду 5е1. Следующий оператор установит уровень изоляции «сериализуемость» на время выполнения транзакции: 5ЕТ Т((АМ5АСТ!ОН 150ЕАТ10Н ЕЕУЕЕ 5Ей!АЕ12АВЕЕ: Чтобы изменить уровень изоляции для всех транзакций в сессии, воспользуйтесь командой АЕТЕй: АЕТЕЙ 5Е55!ОН5 5ЕТ 150ЕАТ10Н СЕЧЕ! 5Ей!АЕ!ЗАВСЕ: Когда установлен уровень изоляции «сериализуемость», Огас!е сохраняет значение оСХ в момент запуска транзакции. Назовем ато значение эСХ пграггзакг(ии. 455 Глава 12.
Работа с базами данных в Огас!е Пока транзакция выполняется, Огас1е считывает только те зафиксированные изменения, для которых значение ВСХ не преышает ВСХ транзакции. Следовательно, чтение всегда являтся воспроизводимым, а фантомы невозможны. Пока транзакция не пытается обновить или удалить какую-либо строку с завершенным изменением, ВСХ которой больше ЯСХ транзакции, обработка транзакции будет идти своим чередом. Если же транзакция попытается обновить или удалить такую сгроку, Огас1е выдаст ошибку «Саппог Бег!а!1ге».