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