Непротиворечивость на уровне транзакции. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Непротиворечивость на уровне транзакции.



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

1. Транзакция, читающая зафиксированные другими транзакциями данные во время ее работы. Пользователь может явно начать такую транзакцию при помощи оператора set transaction read write. Транзакция по умолчанию (от начала сеанса до первой команды commit/rollback, от commit/rollback до следующей commit/rollback или до конца сеанса) является транзакцией этого типа. Перед началом любой транзакции по умолчанию неявно выполняется оператор set transaction read write. Если два оператора select в разных частях транзакции этого типа обращаются к одним и тем же строкам в таблице БД, то возможно получение различных (противоречивых) результатов. Противоречие возникнет в том случае, если какой-либо пользователь модифицировал и зафиксировал изменения этих строк на интервале времени между двумя вышеупомянутыми операторами select. То есть в рамках одной транзакции возможно чтение данных, модифицированных и зафиксированных (committed) другими пользователями. Следует отметить, что появление ошибки ORA-1555 возможно в случае, если Oracle не может обеспечит непротиворечивость на уровне оператора select, входящего в данную транзакцию.

2. Транзакция 'только для чтения'. Пользователь может начать такую транзакцию при помощи оператора set transaction read only и закончить оператором commit/rollback. Внутри такой транзакции можно употреблять только операторы select, операторы DML недопустимы. При обращении операторов select из различных частей транзакции к одним и тем же строкам данных Oracle выдает либо одинаковые непротиворечивые данные, находившиеся в БД на момент начала транзакции (set transaction read only), либо ошибку ORA-1555.

3. Сериализуемая транзакция. Такая транзакция начинается оператором set transaction isolation level serializable. Такие транзакции предназначены для сериализации обновлений при конкурентной работе нескольких пользователей с одними и теми же данными. При помощи этих транзакций, одновременно выдаваемых разными пользователями, результат модификации данных в базе таков, как если бы соблюдалась очередность, то есть сначала один пользователь начал и закончил транзакцию, после него второй провел свою транзакцию, потом третий и т.д. Вообще говоря, процесс сериализации транзакций очень сложен, и не всегда возможно сериализовать одновременно проводимые несколькими пользователями транзакции. Отметим, что если запись в какую-либо таблицу или таблицы ведется только одним пользователем, то необходимость в сериализации отпадает. Сериализуемые транзакции всегда непротиворечивы, то есть все выборки получают данные из 'снимка' базы, сделанного на момент выдачи оператора set transaction isolation level serializable. При условии, что запись осуществляется только в рабочие таблицы данного пользователя, можно трактовать сериализуемые транзакции: как транзакции только для чтения (read only) с возможностями выдачи операторов DML (insert, delete и update). Это удобно, когда программа получения сложного отчета сохраняет результаты в промежуточных рабочих таблицах, из которых затем отчет выводится на печать.

По умолчанию Oracle устанавливает уровень изоляции в чтение и запись. (set transaction read write)

Реализация блокирования

СУБД использует блокировки, чтобы в каждый момент времени те или иные данные могли изменяться только одной транзакцией. Говоря проще, блокировки — это механизм обеспечения одновременного доступа. При отсутствии определенной модели блокирования, предотвращающей одновременное изменение, например, одной строки, многопользовательский доступ к базе данных попросту невозможен. Однако при избыточном или неправильном блокировании одновременный доступ тоже может оказаться невозможным. Если пользователь или сама СУБД блокирует данные без необходимости, то работать одновременно сможет меньшее количество пользователей. Поэтому понимание назначения блокирования и способов его реализации в используемой СУБД принципиально важно для создания корректных и масштабируемых приложений.

Принципиально важно также понимать, что в различных СУБД блокирование реализовано по-своему. В одних — используется блокирование на уровне страниц, в других — на уровне строк; в некоторых реализациях выполняется эскалация блокировок со строчного на страничный уровень, в других — не выполняется; в некоторых СУБД используются блокировки чтения, в других — нет; в одних СУБД реализуется уровень изолированности транзакций SERIALIZABLE с помощью блокирования, а в других — через согласованные по чтению представления данных (без установки блокировок). Эти небольшие отличия могут перерасти в огромные проблемы, связанные с производительностью, или даже привести к возникновению ошибок в приложениях, если не понимать их особенностей.

Ниже приведены принципы блокирования в СУБД Oracle.

- Oracle блокирует данные на уровне строк и только при изменении. Эскалация блокировок до уровня блока или таблицы никогда не выполняется.

- Oracle никогда не блокирует данные с целью считывания. При обычном чтении блокировки на строки не устанавливаются.

- Сеанс, записывающий данные, не блокирует сеансы, читающие данные. Повторю: операции чтения не блокируются операциями записи. Это принципиально отличается от практически всех остальных СУБД, в которых операции чтения блокируются операциями записи.

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

 

Эти факты необходимо учитывать при разработке приложений, однако следует помнить, что эти принципы используются только в Oracle. Разработчик, не понимающий, как используемая СУБД обеспечивает одновременный доступ, неизбежно столкнется с проблемами целостности данных (особенно часто это происходит, когда разработчик переходит с другой СУБД на Oracle, или наоборот, и не учитывает в приложении различия механизмов обеспечения одновременного доступа).

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

Виды блокировок:

Блокировки строк (TX)

Монопольная блокировка данных запрашивается для индивидуальной строки от имени транзакции, если эта строка модифицируется одним из следующих предложений: INSERT, UPDATE, DELETE или SELECT с фразой FOR UPDATE. Строка всегда блокируется монопольно, так что другие пользователи не могут модифицировать эту строку до тех пор, пока транзакция, удерживающая блокировку, не будет подтверждена или отменена. Блокировки строк всегда запрашиваются ORACLE автоматически как результат приведенных выше предложений.

 

 

Блокировки таблиц (TM)

Транзакция запрашивает блокировку таблицы, когда таблица модифицируется следующими предложениями: INSERT, UPDATE, DELETE, SELECT с фразой FOR UPDATE, либо блокируется предложением LOCK TABLE. Блокировка таблицы может удерживаться в одном из следующих режимов: разделяемая для строк (RS), монопольная для строк (RX), разделяемая для таблицы (S), разделяемая для строк монопольная (SRX) и монопольная(X). Степень ограничения доступа, налагаемая блокировкой, определяет, какие режимы блокировок по этой же таблице могут быть получены другими одновременными транзакциями.

 

 

Разделяемые для строк блокировки таблиц (RS)

Эта блокировка указывает, что транзакция, удерживающая блокировку по таблице, блокировала строки в этой таблице и намерена обновить их. Эта блокировка автоматически запрашивается для ТАБЛИЦЫ, модифицируемой следующими предложениями:

 

SELECT... FROM таблица... FOR UPDATE OF...;

 

LOCK TABLE таблица IN ROW SHARE MODE;

 

Блокировка RS - это наименее ограничительный режим блокировки таблицы, предоставляющий наибольшую степень одновременного доступа к таблице.

Блокировка RS, удерживаемая транзакцией, запрещает другим транзакциям получать монопольный доступ по записи к данной таблице, который запрашивается следующим предложением (и только им):

 

LOCK TABLE таблица IN EXCLUSIVE MODE;

 

 

Монопольные для строк блокировки таблиц (RX)

Эта блокировка обычно указывает, что транзакция, удерживающая блокировку по таблице, уже выполнила одно или несколько обновлений в строках таблицы. Эта блокировка автоматически запрашивается для ТАБЛИЦЫ, модифицируемой следующими предложениями:

INSERT INTO таблица...;

UPDATE таблица...;

DELETE FROM таблица...;

LOCK TABLE таблица IN ROW EXCLUSIVE MODE;

 

Блокировка RX, удерживаемая транзакцией, запрещает другим транзакциям вручную блокировать таблицу для монопольного чтения или записи; поэтому другие транзакции не могут одновременно использовать следующие предложения:

LOCK TABLE таблица IN SHARE MODE;

LOCK TABLE таблица IN SHARE EXCLUSIVE MODE;

LOCK TABLE таблица IN EXCLUSIVE MODE;

 

 

Разделяемые блокировки таблиц (S)

Блокировка S, удерживаемая транзакцией, позволяет другим транзакциям одновременно лишь опрашивать эту таблицу, блокировать выбираемые строки с помощью команды SELECT... FOR UPDATE, или успешно выполнять предложения LOCK TABLE... IN SHARE MODE; никакие обновления они не могут осуществлять. Несколько транзакций могут одновременно удерживать блокировки S для одной и той же таблицы.

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

LOCK TABLE таблица IN SHARE EXCLUSIVE MODE;

LOCK TABLE таблица IN EXCLUSIVE MODE;

LOCK TABLE таблица IN ROW EXCLUSIVE MODE;

 

 

Разделяемые для строк монопольные блокировки таблиц (SRX)

Блокировка SRX, удерживаемая транзакцией, позволяет другим транзакциям одновременно лишь опрашивать эту таблицу или блокировать выбираемые строки с помощью команды SELECT... FOR UPDATE, но не обновлять эту таблицу.

Блокировка SRX, удерживаемая транзакцией, запрещает другим транзакциям получать блокировки SRX по этой таблице и модифицировать эту таблицу. Транзакция не может вставлять, обновлять или удалять строки в таблице, если какая-то другая транзакция имеет блокировку SRX по этой таблице. Блокировка SRX, удерживаемая транзакцией, также запрещает другим транзакциям получать блокировки SRX, S и RX по этой таблице; иными словами, другие транзакции не могут успешно выполнять следующие предложения:

LOCK TABLE таблица IN SHARE MODE;

LOCK TABLE таблица IN SHARE EXCLUSIVE MODE;

LOCK TABLE таблица IN ROW EXCLUSIVE MODE;

LOCK TABLE таблица IN EXCLUSIVE MODE;

 

 

Монопольные блокировки таблиц (X)

Эта блокировка вводит самый ограничительный режим, который обеспечивает транзакции, удерживающей эту блокировку по таблице, возможность монопольной записи в таблицу. Эта блокировка запрашивается для таблицы следующим предложением LOCK TABLE таблица IN EXCLUSIVE MODE;

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

 

 

Конверсия и эскалация блокировок данных

ORACLE автоматически конвертирует блокировку таблицы из более слабой в необходимую более строгую степень ограничений. Например, предположим, что транзакция использует предложение SELECT с фразой FOR UPDATE, чтобы заблокировать строки в таблице. Как следствие, она получает монопольные блокировки строк и разделяемую для строк блокировку таблицы. Если эта транзакция позднее обновляет одну или несколько заблокированных строк, блокировка таблицы автоматически конвертируется из режима RS в режим RX.

ORACLE никогда не прибегает к эскалации блокировок, когда СУБД автоматически заменяет многочисленные блокировки, полученные на одном уровне другой блокировкой на более высоком уровне.

 

3. Задания для самостоятельной работы

1. Определите одну транзакцию, содержащую несколько команд.

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

3. Организуйте выполнение основных типов блокировок.

 

4 Контрольные вопросы

 

1. Дайте определение транзакции.

2. Поясните синтаксис блокировки данных.

3. Какие виды блокировок данных вам известны? Приведите примеры.

4. Что такое уровень изоляции транзакции?

5. Какие команды допустимы в транзакциях?

6. Что такое непротиворечивость данных?

 


 

Лабораторная работа №9

Процедурный язык PL/SQL

 

Цель и порядок работы

Цель работы

Общее знакомство с процедурным языком PL/SQL. Написание процедур, с использованием PL/SQL.

Порядок выполнения работы

- Ознакомиться с описанием работы;

- Выполнить задание согласно варианту;

- Ответить на контрольные вопросы;

- Представить результаты работы преподавателю.

 

2 Общие сведения

PL/SQL - это процедурный язык пошагового программирования, инкапсулирующий язык SQL. В результате получается хорошо развитый язык программирования третьего поколения (3GL), подобный языку C++, Pascal и т. д. В своей сути PL/SQL блочно ориентирован. PL/SQL имеет строгие правила области видимости переменных, поддерживает параметризованные вызовы процедур и функций и так же унаследовал от языка ADA такое средство, как пакеты (package). PL/SQL предусматривает строгий контроль типов, все ошибки несовместимости типов выявляются на этапе компиляции и выполнения. Так же поддерживается явное и неявное преобразование типов.

PL/SQL - поддерживает сложные структуры данных, так же предусмотрена перегрузка подпрограмм, для создания гибкой среды прикладного программирования. Язык PL/SQL - имеет элемент Exception Handler (обработчик исключительных ситуаций) для синхронной обработки ошибок на этапе выполнения кода PL/SQL. Также строго говоря, язык PL/SQL не является объектно-ориентированным, хотя имеет некоторые средства для создания и работы с объектами БД на уровне объектно-ориентированных языков программирования. Что-то очень похожее на ООП в PL/SQL имеется.

PL/SQL - является машинно- независимым языком программирования. И это действительно так. Например, не нужно изучать PL/SQL для Windows или для Unix. Сам код программных блоков PL/SQL не зависит от платформы, на которой они выполняются. Сам язык остается таким же как и он есть! Вот вам и мультиплатформенность. PL/SQL - поддерживает стандартные интерфейсы работы с языками высокого уровня такими как C, C++ - через предкомпиляторы поставляемые фирмой Oracle. Например, для работы с языком C есть такое средство как OCI (Oracle Call Interface). Так же PL/SQL имеет ряд встроенных средств для работы с Internet, прямо из хранимых процедур. Имеет поддержку создания HTTP запросов так же непосредственно из хранимых процедур. Вот, что из себя представляет встроенный язык PL/SQL сервера Oracle. Однако прежде чем приступать, к изучению PL/SQL необходимо сказать несколько слов о его среде выполнения.

В типичной клиент/серверной среде обычно, самое узкое место это - сеть и то как она построена и отлажена вашим администратором сети. Кстати взаимодействие администратора сети и администратора БД, является немаловажным фактором.

 

Рисунок 80- Среда клиент-сервер в типичном представлении

 

Здесь хорошо видно, что используется при работе с сервером БД Oracle. Клиенты использующие программы на языках высокого уровня, с большим количеством единичных запросов SQL. Средства разработки SQL*Plus, серверы приложений, и т.д. Между клиентами и сервером, как правило, стоит некий посредник, так же определяющий скорость обработки запросов поступающих от клиента к серверу. На жаргоне БД админов, их еще называют "толстыми" или "тонкими" клиентами. Например, на первом этапе работы с БД можно использовать сервер БД InterBase, а клиентов создавать на Borland Delphi с использованием "толстого" клиента IBX компонент. Идем дальше:

Рисунок 81 – система исполнителя языка Клиент-сервер

 

Программы, написанные на языке PL/SQL, выполняются системой-исполнителем языка, которая представляет собой часть сервера БД Oracle. Независимо от средства, с помощью которого формируется исполняемый код, он посылается на сервер Oracle. Система исполнитель языка PL/SQL сканирует, разбирает и компилирует код. После этого код, готов к выполнению. Выполняется код посредством передачи его SQL Statement Executor (системе исполнителю SQL-кода). Набор данных, полученных в результате исполнения запроса, поступает в систему исполнитель PL/SQL для дальнейшей обработки. Вот таким образом действует этот механизм. Далее давайте рассмотрим, в чем преимущество использования PL/SQL как процедурного языка.

Рисунок 82- Группировка кода в единый блок языка PL/SQL,позволяет уменьшить загрузку сети

 

Здесь показано, как выполняются хранимые процедуры и функции, вызываемые неименованными блоками. Подпрограммы могут выполнять достаточно сложные вычисления, а так же обрабатывать ошибки. Такой вызов подпрограмм еще называют "удаленный вызов процедур" (Remote Procedure Call). Либо возможно так же вызовы одной подпрограммы другой! Использование хранимых процедур и функций позволяет вам добиться максимальной производительности сервера БД, а так же эффективного повторного использования ранее созданного кода. Все блоки PL/SQL, в процессе компиляции хранятся в системном КЭШе - называемом SGA (System Global Area), там же находятся все таблицы схемы, переменные и т.д. Пространство, выделенное для каждого отдельного блока PL/SQL, называется "КУРСОР"! Все PL/SQL блоки сохраняются в SGA посредством алгоритма Least Recently Used (звучит как - использованные наиболее давно). Любой SQL код внутри блока PL/SQL, так же получает собственные разделяемые области SQL. Так же по завершении компиляции подпрограммы запоминаются в словаре данных. Код всех подпрограмм является - реентерабельным! То есть к подпрограмме может обращаться несколько схем согласно прав использования подпрограмм. Все подпрограммы загруженные в область SGA являются разделяемыми

Основное преимущество при работе с PL/SQL как языком БД является то, что на исполнение серверу посылается группа SQL предложений, а не единичные запросы сформированные, скажем какой-либо программой не использующей PL/SQL как средство работы с БД. Действительно, получив PL/SQL блок, сервер приступает к его обработке, а клиенту остается только ожидать результата операции. Тогда как единичные запросы к БД, порождают большой трафик и тормозят работу сети в целом. То есть, говоря точным языком, на сервере снижается число активных транзакций, вследствие того, что за одну активную транзакцию, обрабатывается большее число операторов PL/SQL!

 



Поделиться:


Последнее изменение этой страницы: 2017-02-09; просмотров: 432; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.83.150 (0.038 с.)