В базах данных и обработке транзакций двухфазная блокировка ( 2PL ) — это пессимистичный метод управления параллелизмом , гарантирующий сериализуемость конфликтов . [1] [2] Это также имя результирующего набора расписаний транзакций базы данных (историй). Протокол использует блокировки , применяемые транзакцией к данным, которые могут блокировать (интерпретироваться как сигналы остановки) другим транзакциям доступ к тем же данным в течение жизни транзакции.
По протоколу 2PL блокировки накладываются и снимаются в два этапа:
В базовом протоколе используются два типа блокировок: общие и эксклюзивные блокировки. Уточнения базового протокола могут использовать больше типов блокировок. При использовании блокировок, блокирующих процессы, 2PL, S2PL и SS2PL могут подвергаться взаимоблокировкам , возникающим в результате взаимной блокировки двух или более транзакций.
Блокировки используются для обеспечения сериализуемости . Транзакция удерживает блокировку объекта, если эта транзакция получила блокировку этого объекта, который еще не был освобожден .
Для 2PL используются только блокировки доступа к данным — блокировки чтения ( общие блокировки ) и блокировки записи ( монопольные блокировки ). Ниже приведены правила блокировки чтения и блокировки записи :
Согласно протоколу двухфазной блокировки , каждая транзакция обрабатывает свои блокировки в две отдельные последовательные фазы во время выполнения транзакции:
Правила двухфазной блокировки можно резюмировать следующим образом: каждая транзакция никогда не должна устанавливать блокировку после того, как она сняла блокировку. Свойство сериализуемости гарантируется для расписания с транзакциями, подчиняющимися этому правилу.
Обычно без явного знания транзакции в конце фазы 1 правило безопасно определяется только тогда, когда транзакция завершила обработку и запросила фиксацию. В этом случае все замки можно снять сразу (этап 2).
Разница между 2PL и C2PL заключается в том, что транзакции C2PL получают все необходимые блокировки до начала транзакции. Это делается для того, чтобы транзакция, которая уже удерживает некоторые блокировки, не блокировала ожидание других блокировок. Консервативный 2PL предотвращает тупики .
Чтобы соответствовать протоколу строгой двухфазной блокировки (S2PL), транзакция должна соответствовать 2PL и снимать блокировки записи (эксклюзивные) только после завершения транзакции (т. е. либо фиксации , либо отмены ). С другой стороны, блокировки чтения (совместного использования) регулярно снимаются во время фазы сжатия.
В отличие от 2PL, S2PL обеспечивает строгость (особый случай бескаскадной восстанавливаемости). Этот протокол не подходит для B-деревьев, поскольку он вызывает узкое место (в то время как B-деревья всегда начинают поиск с родительского корня). [ нужна цитата ]
или Строгость , или Строгое планирование , или Строгая двухфазная блокировка
Чтобы соответствовать строгой двухфазной блокировке (SS2PL), блокировки чтения и записи транзакции снимаются только после ее завершения (т. е. либо фиксации, либо отмены). Транзакция, подчиняющаяся SS2PL, имеет только фазу 1 и не имеет фазы 2 до завершения транзакции. Каждое расписание SS2PL также является расписанием S2PL, но не наоборот.