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