Глава 16. Типовые решения для обработки задач автономного параллелизма 469
Принцип действия
Для реализации неявной блокировки необходимо вынести код, который никак нельзя
пропустить при описании схемы блокирования, в инфраструктуру приложения. За не-
имением лучшего термина будем использовать понятие "инфраструктура" для обозначе-
ния совокупности супертипов слоя, классов инфраструктуры и всех других конструкций,
обеспечивающих жизнедеятельность приложения (подобно тому как водопровод и сис-
темы отопления обеспечивают жизнедеятельность в зданиях и городах). Обеспечить
корректное блокирование могут также средства автоматической генерации кода. Не-
сомненно, принцип вынесения кода блокировки в инфраструктуру приложения от-
нюдь не является революционным открытием. Полагаю, о нем задумывались все те,
кому пришлось написать хотя бы несколько повторяющихся фрагментов механизма
блокирования. Тем не менее, все воплощения этой идеи, встречавшиеся мне на практи-
ке, оказывались довольно слабы, поэтому уделим ей еще немного внимания.
Прежде всего для обеспечения неявной блокировки необходимо составить список про-
цедур, которые являются обязательными в рамках конкретной стратегии блокирования.
При использовании оптимистической автономной блокировки (Optimistic Offline Lock, 434)
этот список будет содержать такие операции, как сохранение номера версии для каждой
строки базы данных, включение проверки номера версии в критерии SQL-операторов
UPDATE и DELETE и увеличение номера версии при изменении соответствующего объекта.
В свою очередь, при использовании пессимистической автономной блокировки (Pessi-
mistic Offline Lock, 445) список необходимых операций будет включать в себя применение
блокировки перед загрузкой каждого необходимого объекта (как правило, это касается
монопольной блокировки чтения и части блокировки чтения/записи, применяющейся
для считывания объекта) и высвобождение всех блокировок по окончании сеанса или
бизнес-транзакции.
Вы, должно быть, обратили внимание, что говоря о пессимистической автономной бло-
кировке, я не упомянул ни одного типа блокировки, применяемого исключительно для
редактирования данных, а именно: монопольной блокировки записи и части блоки-
ровки чтения/записи, предназначенной только для выполнения записи. Да, эти бло-
кировки обязательно применяются в том случае, когда бизнес-транзакции нужно отре-
дактировать данные. Тем не менее неудачные попытки наложения таких блокировок
неявным способом могут привести к ряду проблем. Во-первых, те условия, в которых
можно применить неявные блокировки записи (например, регистрация измененного
объекта в единице работы (Unit of Work, 205)), не гарантируют аварийного завершения
транзакции в самом начале работы пользователя. Приложение не сможет само опреде-
лить, когда именно нужно применить такие блокировки. Несвоевременное прерывание
транзакции в том случае, если предоставление блокировки невозможно, противоречит
концепции пессимистической автономной блокировки, согласно которой пользователь не
должен переделывать свою работу.
Второй, и столь же важный, факт состоит в том, что блокировки записи значительно
ограничивают возможность параллельной работы в системе. В этом случае отказ от не-
явной блокировки принуждает разработчика задуматься о влиянии блокировок записи
на степень параллелизма системы, переводя этот вопрос из чисто технической сферы в
область бизнес-требований. Тем не менее нам все-таки нужно гарантировать, что все
необходимые блокировки записи будут применены перед внесением соответствующих
изменений. Эту проверку можно поручить инфраструктуре приложения. Отсутствие