Мы используем 3PC (трехфазное обязательство) для распределенной транзакции. Есть 4 узла, A, B, C, D, где A - координатор.
- A получил OK от всех остальных и отправил им сообщение о подготовке к фиксации.
- Пока C и D получили это сообщение и перешли в подготовленное состояние, B вылетает и не получает это сообщение (таким образом, оставаясь в состоянии ожидания).
- Таймаут на B и отправляет прерывание всем остальным, но только D получает сообщение прерывания, в то время как C аварийно завершает работу до получения сообщения прерывания.
Теперь вопрос: что будет делать C после восстановления? Согласно http://courses.cs.vt.edu/~cs5204/fall00/distributedDBMS/sreenu/3pc.html, C будет выполнять фиксацию при восстановлении после перехода отказа вместо прерывания, как это делает D. Не приведет ли это к противоречивому состоянию? Или у C есть какой-то механизм для определения того, что транзакция прервана?