Я столкнулся с ситуацией, когда начал сомневаться, действительно ли протокол двухфазной фиксации гарантирует свойства ACID, особенно его часть 'A'.
Давайте посмотрим на теоретическую распределенную транзакцию, включающую 2 ресурса. (Более практическое описание проблемы, с которой мне пришлось столкнуться, вы можете найти в моем блоге ). Сценарий - это нормальное выполнение распределенной транзакции (без сбоев или восстановления). Приложение запускает транзакцию, обновляет оба ресурса и выполняет вызов commit (). После завершения фиксации приложение проверяет оба ресурса и видит все изменения в завершенной транзакции. Все хорошо, протокол 2PC сделал свое дело, верно?
Теперь небольшое изменение в сценарии. Пока распределенная транзакция выполняет commit (), другое приложение использует те же 2 ресурса. Может ли он видеть только часть изменений от транзакции? Допустим, изменения в одном ресурсе уже видны, в то время как изменения во втором ресурсе еще не видны?
Во всей информации, которую я прочитал по протоколу 2PC, я не смог найти никаких гарантий относительно видимости изменений в отдельных ресурсах относительно друг друга. И я не смог найти ничего, что говорило бы о том, что все ресурсы завершают свои отдельные коммиты в одно и то же время.