Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Блокировки






 

БЛОКИРОВКА (LOCK) - это механизм, используемый для того, чтобы предотвратить деструктивные взаимодействия между процессами сервера, обращающимися к одному и тому же ресурсу, будь то таблица БД или одна строка в таблице.

 

В многопользовательской базе данных могут применяться два уровня блокировок:

 

§ Монопольная (эксклюзивная) блокировка – запрещает разделение ассоциированного ресурса. Первая транзакция, получившая монопольную блокировку ресурса, становится единственной транзакцией, которая может изменять этот ресурс до снятия монопольной блокировки.

§ Разделяемая блокировка – позволяет совместно использовать ассоциированный ресурс, в зависимости от того, какие операции выполняются (например, несколько пользователей могут читать данные одновременно). Несколько транзакций могут получить разделяемые блокировки для одного и того же ресурса.

 

Запирающая блокировка (blocking lock) – ситуация, которая возникает, когда один процесс наложил на данные блокировку, а другой хочет наложить такую же, либо более высокую блокировку. Второй процесс «зависает», ожидая снятия блокировки первым процессом.

Взаимоблокировка, тупик (deadlock) - ситуация, которая возникает, когда два или более процесса ожидают данных, заблокированных друг другом

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

 

Многоверсионная модель согласованности данных.

 

§ Oracle обеспечивает для всех запросов согласованность по чтению на уровне предложения, которая гарантирует, что данные, возвращаемые запросом, согласованы по отношению к моменту начала этого запроса.

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

o Транзакции read-only – могут содержать только запросы и не могут содержать никаких предложений DML (языка манипулирования данными). В течение транзакции её доступны данные, которые были зафиксированы к моменту её начала.

o Монопольные блокировки таблиц и строк. Если повторяемость чтений необходимо обеспечить в транзакциях, содержащих предложения DML, транзакция может явно запросить разделяемые блокировки по таблицам или монопольные блокировки по тем строкам, которые будут считываться неоднократно.

 

По умолчанию Oracle автоматически блокирует строки, на которые воздействуют операторы INSERT, UPDATE или DELETE; причём блокируются только те строки, на которые фактически оказано воздействие, а не вся таблица или весь блок данных.

Назначение блокировок данных (блокировок DML) - защитить данные таблицы, гарантируя их целостность при одновременном доступе к данным нескольких пользователей. Блокировки данных предотвращают деструктивное взаимодействие одновременных конфликтующих операций DML и операций DDL. Операции DML могут получать блокировки на двух различных уровнях: для конкретных строк и для целых таблиц.

 

Блокировки строк (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 my_table FOR UPDATE OF...;

LOCK TABLE my_table IN ROW SHARE MODE;

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

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

LOCK TABLE my_table IN EXCLUSIVE MODE;

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

 

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

· INSERT INTO...;

· UPDATE...;

· DELETE FROM...;

· LOCK TABLE my_table IN ROW EXCLUSIVE MODE;

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

 

· LOCK TABLE my_table IN SHARE MODE;

· LOCK TABLE my_table IN SHARE EXCLUSIVE MODE;

· LOCK TABLE my_table IN EXCLUSIVE MODE;

 

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

 

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

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

· LOCK TABLE my_table IN SHARE EXCLUSIVE MODE;

· LOCK TABLE my_table IN EXCLUSIVE MODE;

· LOCK TABLE my_table IN ROW EXCLUSIVE MODE;

 

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

 

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

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

· LOCK TABLE my_table IN SHARE MODE;

· LOCK TABLE my_table IN SHARE EXCLUSIVE MODE;

· LOCK TABLE my_table IN ROW EXCLUSIVE MODE;

· LOCK TABLE my_table IN EXCLUSIVE MODE;

 

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

 

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

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

 

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

 

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

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

 

Защелки

 

Защелки (latches) - это простые, низкоуровневые механизмы очередизации, которые защищают структуры разделяемых данных в SGA. Например, защелки защищают список пользователей, обращающихся к базе данных в текущий момент, а также структуры данных, описывающие блоки в буферном кэше. Серверный или фоновый процесс получает защелку на очень короткое время, пока он манипулирует или просматривает одну из таких структур. Реализация защелок зависит от операционной системы, особенно в вопросе о том, ожидает ли процесс замка и сколь долго.

 

Внутренние блокировки

 

Внутренние блокировки - это более сложные механизмы, чем защелки, и они служат разнообразным целям. Рассмотрим их назначение ниже для трех различных категорий внутренних блокировок:

 

1. Блокировки кэша словаря. Эти блокировки на очень короткое время удерживаются для записей словаря данных при использовании или модификации этих записей. Они гарантируют, что предложения SQL во время их разбора видят согласованные определения объектов. Блокировки кэша словаря могут быть разделяемыми и монопольными. Разделяемые блокировки освобождаются по окончании синтаксического разбора. Монопольные блокировки освобождаются по концу операции DDL.

2. Блокировки управления файлами и журналом. Эти блокировки защищают различные файлы. Например, одна блокировка защищает управляющий файл, чтобы его мог модифицировать лишь один процесс в отдельный момент времени. Другая блокировка координирует использование и архивирование файлов журнала повтора. Файлы данных блокируются для того, чтобы гарантировать, что база данных монтируется несколькими экземплярами в разделяемом режиме или одним экзепляром в монопольном режиме. Поскольку блокировки файлов и журнала отражают состояние файлов, эти блокировки по необходимости удерживаются продолжительное время.

3. Блокировки табличных пространств и сегментов отмены. Эти блокировки защищают табличные пространства и сегменты отмены. Например, все экземпляры, имеющие доступ к базе данных, должны согласованно отражать онлайновое или офлайновое состояние табличного пространства. Сегменты отмены блокируются для того, чтобы лишь один экземпляр мог писать в сегмент отмены.

 

Явные блокировки данных

 

Во всех случаях Oracle автоматически осуществляет блокировки для обеспечения одновременного доступа, целостности и согласованности данных на уровне предложения. Однако имеются возможности, которые позволяют вам перекрывать умалчиваемые механизмы блокировок Oracle. Такое перекрытие полезно в следующих ситуациях:

 

· Приложениям требуется согласованность по чтению на уровне транзакций или " повторяемость чтений"; транзакциям необходимо опрашивать множество данных, согласованное на все время выполнения транзакции, с гарантией, что эти данные не будут изменены другими транзакциями в системе.

· Приложениям требуется, чтобы транзакция имела монопольный доступ к ресурсу; такая транзакция может выполняться, не ожидая завершения других транзакций.

 

Мониторинг блокировок в системе

 

АБД должен уметь отслеживать состояние блокировок в системе, разрешать ситуации с возникновением запирающих блокировок, взаимоблокировок. Как всегда, неоценимую помощь в этом оказывают представления словаря данных:

 

V$LOCK – представление, отображающее информацию о блокировках, как установленных и удерживаемых (holding locks), так и о ожидающих блокировках (requested locks). Например:

 

ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK

 

6C6EC69C 6C6EC6AC 2 MR 7 0 4 0 13636 0

6C6EC56C 6C6EC57C 2 MR 3 0 4 0 13636 0

6C6EC520 6C6EC530 2 MR 2 0 4 0 13636 0

6C6EC4D4 6C6EC4E4 2 MR 1 0 4 0 13636 0

6C6EC3F0 6C6EC400 3 RT 1 0 6 0 13637 0

6C6EC2C0 6C6EC2D0 4 XR 4 0 1 0 13640 0

6C6EC43C 6C6EC44C 5 TS 8 1 3 0 13631 0

6CFA1420 6CFA152C 11 TX 458765 1664 6 0 12386 1

6CF4E058 6CF4E06C 11 TM 27987 0 3 0 12386 0

6CF4E0DC 6CF4E0F0 12 TM 27987 0 3 0 12 0

6C6EC358 6C6EC368 12 TX 458765 1664 0 6 12 0

 

Столбец LMODE описываем режим удерживаемой блокировки, столбец REQUEST – режим ожидаемой блокировке (см. таблицу)

 

LMODE NUMBER Режим удерживаемой блокировки: 0 - none 1 - null (NULL) 2 - row-S (SS) 3 - row-X (SX) 4 - share (S) 5 - S/Row-X (SSX) 6 - exclusive (X)
REQUEST NUMBER Режим ожидающей блокировки: 0 - none 1 - null (NULL) 2 - row-S (SS) 3 - row-X (SX) 4 - share (S) 5 - S/Row-X (SSX) 6 - exclusive (X)

 

Столбце SID описывает номер сессии, вовлеченной в блокировку. По этому столбцу удобно связывать V$LOCK с представлением V$SESSION, в котором можно почерпнуть информацию о параметрах сессии (имя компьютера, программы и т.д.), вовлеченной в блокировку. В свою очередь, представление V$SESSION можно связать с представлением V$SQL, из которого можно выяснить, какое именно SQL-выражение привело к возникновению блокировки (по столбцам SQL_HASH_VALUE в V$SESSION и HASH_VALUE в V$SQL).

 

Представление DBA_LOCK также выдает информацию по блокировкам в системе.

 

DBA_BLOCKERS – представление, которое просто показывает SID тех сессий, которые удерживают блокировки.







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.