База данных Oracle использует блокировки (lock) для обеспечения того, что изменение указанного фрагмента данных в каждый конкретный момент времени может совершать максимум одна транзакция. По существу блокировки — это механизмы, которые разрешают параллельную обработку; без применения какой-либо модели блокировки для предотвращения, например, одновременных обновлений одной и той же строки, многопользовательский доступ к базе данных был бы невозможным.
Однако при злоупотреблении или неправильном использовании блокировки могут в действительности только мешать параллельной обработке. Если программист или сама база данных блокирует данные без необходимости, то меньшее число людей сможет параллельно выполнять операции. Поэтому понимание сущности блокировки и особенностей ее работы в базе данных исключительно важно при построении масштабируемого и корректно функционирующего приложения.
Очень важно также понимать, что каждая база данных реализуют блокировку по-своему. В одних блокировка осуществляется на уровне страниц, в других — на уровне строк. Одни базы данных распространяют блокировки с уровня строк на уровень страниц, другие этого не делают. В одних базах данных блокировки чтения применяются, в других - нет. В некоторых базах данных последовательные транзакции реализованы через блокирование, а в других - посредством согласованных по чтению представлений данных (без блокировок). Все эти мелкие различия могут приводить к огромным проблемам с производительностью или явным программным ошибкам, если не понимать особенностей их работы.
Ниже описаны принципы политики блокировки Oracle
- Oracle блокирует данные на уровне строк при модификации данных. Блокировка не распространяется на уровни блока или таблицы.
- Oracle никогда не блокирует данные, чтобы всего лишь прочитать их. Простые операции чтения не помещают какие-либо блокировки на строки данных.
- Процесс, записывающий данные, не блокирует процесс, который читает данные. Позвольте повторить: операции чтения не блокируются операции записи. Это фундаментальным образом отличается от многих других баз данных, в которых операции чтения блокируются операциями записи. Хотя такая характеристика кажется исключительно положительной (в основном, так оно и есть), попытка наложения ограничений целостности посредством логики приложения при недостаточном понимании этой концепции, скорее всего, приведет к получению неправильной реализации.
- Процесс, записывающий данные, блокируется только в том случае, если другой процесс, выполняющий запись, уже заблокировал строку, к которой обращается этот процесс. Процесс, читающий данные, никогда не блокирует процесс, который выполняет запись.
Указанные обстоятельства должны учитываться при развертывании приложения. При этом необходимо осознавать, что описанная политика уникальна Oracle — каждая база данных обладает собственными особенностями реализации блокировки. Даже приводя все свои приложения к "наименьшему общему знаменателю SQL", следует учитывать, что модели блокировки и параллельной обработки, используемые каждым поставщиком баз данных, определяют различия в поведении приложения. Разработчик, который не понимает, каким образом база данных реализует параллельную обработку, неизбежно столкнется с проблемами целостности данных. Это особенно часто происходит при переходе от другой базы данных к Oracle и наоборот, а также из-за пренебрежения учета в приложениях отличий между механизмами параллельной обработки.