|
Программирование >> Реляционные базы данных
непосредственно перед строкой (9). которая начинает транзакцию. Делать это после строки (9) бессмысленно. Сообщить системе SQL о том, что транзакция записывает или способна записывать данные, можно с помошью оператора SET TRANSACTION READ WRITE: Однако этот режим обычно принят по умолчанию и явно определять его необязательно. 7.2.5 Грязное чтение Грязные данные -эгт данные, записанные транзакцией, которая еще не зафиксирована. Грязное чтение-это чтение грязных данных. Риск считывания Падзных данных в том, что записавшая их транзакция может быть прервана. Тогда грязные данные удаляются из БД навсегда и все идет так, словно их никогда не существовало. Если транзакция прочла грязные данные, она затем может быть зафиксирована или выполнять другое действие, отражающее знание об этих данных. В одних случаях грязное чтение имеет значение, в других нет. Иногда оно не стоит поглошающей время работы, которую система управления БД должна провести для предотвращения грязных чтений. Рассмотрим, что может произойти, когда грязное чтение допускается. Пример 7.15. Рассмотрим еше раз перевод счета в примере 7.12, предположив, что теперь переводы реализуются программой Р, которая выполняет следующие шаги: 1. Добавляет деньги к счету 2. 2. Проверяет, достаточно ли денег на счете I. (a) Если денег недостаточно, удаляет деньги со счета 2 и прекращает работу. (b) Если денег достаточно, снимает деньги со счета I и принимает результат. Если Р выполняется в последовательной форме, то временное помещение денег на счет 2 не имеет значения. Никто их не увидит, и они будут удалены, если перевод невозможен. Но предположим, что допустимо грязное чтение. Пусть имеется три счета -/II, А2 и со 100, 200 и 300 дол. соответственно. Транзакция Г, выполняет программу Р, чтобы перевести 150 дол. со счета Л\ на счет А2. В то же самое время транзакция выполняет Р, чтобы перевести 250 дол. со счета А2 на счет /13. Тогда возможны сяслугошие события: 1. Тг выполняет шаг I и добавляет 250 дол. к счету АЪ, на котором теперь стало 550 дол. 2. Т\ выполняет шаг I и добавляет 150 дол. к счету А2, на котоК м теперь стало 350 дол. 3. Ъ выполняет тест шага 2 и обнпружинает, что на счете А2 достаточно денег (350 дол.), чтобы перевести 250 дол. со счета А2 на счет ЛЗ. 4. Т\ выполняет тест шага 2 и обнаруживает, что на счете А\ недостаточно денег (100 дол.), чтобы перевести 150 дол. со счета А\ на счет А2. 5. Tl выполняет шаг 2Ь. Она снимает 250 дол. со счета /12, на котором остается 100 дол., и принимает результат. 6. 7 выполняет шаг 2а. Она снимает 150 дол. со счета /12, на котором остается -50 дол., и прекращает работу. Общая сумма аенег не HSMei-HUiacb; на трех счетах по-прежнему 600 лол. Но поскйтьку на третьем шаге из перечисленных шест 1\ считышьта грязные данные, по* пился отрицательны!! счет, что должен был предотирлтить тест первого счета, преднюначен-ный для того, чтобы опреде.Ц1ть, достаточно ли на нем денег. □ Пример 7.16. Рассмотрим другой вариант функции поиска места из примера 7.11. Он з:1кл10члется в спелующем: 1. Находим свободное место и резервируем его. устанавливая атрибут occupied дли этого места в значение I. 2. Просим клиента полтиерлить предложенное место. При подтне1 кденнн результгг принимается. В протинно-м случае место освобождается установкой occupied в значение О и повторяется шаг I аля получения другого места. Если две транзакции выполняют этот мгоритм практически одновременно, одна нз них может зарезервировать место S, от которого позже клиент откажется. Еслн вторая транзакция выполняет шаг 1, когда место S отмечено как занятое, клиент этой транзакции лишается возможности получить место S. Как н в примере 7.15. проблема связана с грязным чтением. Вторая транзак--ция видела кортеж (с местол* S, отмеченны.м как занятое), записанный i позже измененный первой транзакцией. □ Насколько важно то, что чтение было грязным ? В примере 7.15 он очень важен, так как привел к появлению отрицательного счета вопреки всем защитным средствам. В примере 7.16 проблема ие выглядит столь серьезной. Конечно, второй клиент .может не получить любимого места в самолете илн даже получит сообщение, что свободных мест нег. Но в последнем случае повторный запуск транзакции почти наверняка оп1)еделт доступность места 5. Такая функция выбора мест, допускающая грязное чтение, ускоряет среднюю скорость запросов о резервировании, поэтому ее целесообразно применять. S0L2 позволяет явно указать, что грязное чтение приемлемо для данной транзакции. Для этого применяется оператор SET TRANSACTION, упомнна8Шийся в разделе 7.2.4. Под>х>дящая форма т5анзакиии, подобно той, что была приведена в примере 7.16- 1) SET TRANSACTION READ WRITE 2) ISOLATION LEVEL READ UNCOMM TTED, Этот oneiiarop выполняет две функции. I Строка (I) показывает, что транзакция читает ч записывает данные. т. Строка (2) означает, что следующая за ней транзаксшя действует на уровне изоляции, лопускаюшем чтение заф11ксироваимых данных. Четыре уровня пзоляиим расематри заются в разде.те 7.2.6. В .1анный момент читателю известны два i3 них: 1Юэможность преобразования в послеяовагельную форму и чтение зафикснровакныч л.тнцыч. Если транзакция предназначена не только для чтении (т.е. записывает в БД по крайнем мере 04шт элемент датых) и определен уровень изоляшп READ UNCOMMINTTED. неоочояимо vKaJaib также READ WRITE. В разлете 7.2.4 было ска WHO, что гранзакиич по yюлчaнпю определена лля чтения и записи. Слу1ай, когда допуст!1мо (рязное чтение, является в .SQL2 исключением. По умолчанию трапз: кция принята юлько хлп чтения, поскольку транзакция с грязным чтением сопряжена с серьезным риском. Если транзакция д!1я чтения и записи выполняется с уровнем июлящщ, допускающим чтение псзафпксиронанныч данных, она должна спе1и1фширов<п ься явно, с помощью READ WRITF. s Происходящее может показаться таинственным, так как мы ис обрашались к алгорит,мам впсдення различных уровней изоляции. Воз,чожно. если две транзакции увидят место своболны.ч и попытаются >арезороиронать его. система прервет одну из них. даже если в ней нет оператора ROLLBACK. 7.2.6 Другие уровни изоляции SQL2 обеспечивает четыре уровня и-зо/шцшг. возможность преобразования R последовательную ([юрму, чтение зафиксированных данных (разрешено грязное чтенгк:). чтение только зафиксированных данных и повторное чтение. Последние два определяются лля данной транзакции с помошью операторов SET TRANSACTION ISOLATION LEVEL READ COMMITTED : SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; соответственно. В обоих случаях транзакция по умолчанию предназначена для чтения и записи, поэтому при желании можно добавить READ ONLY к любому из этих операторов. Можно также явно определить SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ; HO делгп-ь это необязательно, поскольку такой режим в S0I.2 принят по умолчанию. Уровень изоляции, допускающий чтение только зафиксированных данных, запрещает чтение грязных (незафиксированных) данных, ио он позволяет одной транзакции многократно повторять один и тот же запрос и получать на него разные ответы, пока эти ответы отражают данные, записанные уже зафиксированными Т15анзакциями. Пример 7.17. Рассмотрим заново функцию выбора мест из примера 7.16, предполагая, что она выполняется на уровне изоляции, допускающем чтение принятых данных. Тогда при поиске мест на шаге I функция не обнаружит места зарезервированными, если другая транзакция зарезервировала их, но ее результат еше не зафиксирован.* Если же клиеггг отвергает предлагаемые места и единственное выполнение функции многократно запрашивает их, при каждом запросе получается разное количество свободных мест, в связи с тем что другие транзакции параллельно резервируют или освобождают места. □ Рассмотрим уровень изоляции, допускающий повторное чтение данных. На этом уровне нет гарантии, что при многократном повторении запроса будет получен один и тот же ответ. При первом извлечении кортежа можно быть уверенным, что при повторении запроса будет получен этот же кортеж. Но возможно и то, что при втором и последующих выполнениях запроса будут получены иллюзорные кортежи, являющиеся результатом операций вставки в БД, произведенной во время выполнения нашей транзакции. Пример 7.18. Вернемся к проблеме выбора мест из примеров 7.16 и 7.17. Если такая функция выполняется на уровне изоляции, допускающем повторное чтение, .место, доступное по первому запросу на шаге I, остается доступным и при последующих запросах. Но предположим, что в отношение Flights вводятся новые кортежи. Напри1.№р. авиалиния предоставила лля рейса более вместительный самолет, создавая новые кортежи, которых раньше не было, или резервирование мест вообще отменено. Тогда на уровне изоляции, допускающем повторное чтение, последующие запросы \Ю1ут извлекать 1шформацю и о новых, свободных местах. □
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |