Здравствуйте, Shmj, Вы писали:
S>Вот тут, кто подзабыл: https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B4%D0%B0%D1%87%D0%B0_%D0%B4%D0%B2%D1%83%D1%85_%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D0%BB%D0%BE%D0%B2
S>По идее эта задача считается неразрешимой.
Не считается. Доказано, что она неразрешима. Или есть вопросы к доказательству?
S>Вопрос у меня вот в чем. Если я перевожу средства со счета в одном банке на счет в другом банке (очевидно у них разные СУБД и нельзя использовать локальную транзакцию). Канал передачи не надежен на 100% — очевидно — это глобальная сеть и сбои могут быть.
S>Но существует же алгоритм, благодаря которому имеем 100% достоверность, что действия будут согласованы и на 100% деньги не исчезнут одновременно с двух счетов а так же не удвоятся, не смотря на то что канал связи не надежен?
Ответ кроется в том, что именно подразумевается под "согласованы". Деньги не исчезнут и не удвоятся, но каждый банк не может доверять информации в своей базе, т.к. требуются подтверждения извне, хотя бы в какие-то эпизоды времени.
S>По идее так. Даю команду перевести 100 руб. на другой счет. Банк 1 сначала создает запись о переводе, уменьшает сумму на счете на 100 руб. Потом пытается связаться с внешним сервисом (пусть там другого банка или нац. банка — не важно) и при успешном ответе от него — уже фиксирует транзакцию. Если ответа нет — то делает запросы до победного конца (деньги будет блокировать, пока не внесется ясность).
S>Но тут какая проблема. Откуда банк 2 знает что банк 1 получил успешный ответ? Вдруг не получил? Значит банк 2 должен сделать запрос к банку 1. Но это очень похоже на задачу двух генералов этих, которая вроде как неразрешима.
очень, но не вполне. Перевод денег не требует синхронности. Поэтому, списать можно сегодня, а обнаружить переведенное — через 3 банковских дня. Лаг в 3 рабочих дня не обеспечивает гарантию, но дает очень-очень надежный статистический результат. Если что пойдет не так, запись о переводе можно доставить хоть на оленях.
S>Или же наличие ответственного в принятии решений как бы делает задачу разрешимой?
задачу о двух генералах — нет, не делает. Банковский перевод может быть при этом достаточно надежным.
S>Вопрос вот в чем. Можно ли как-то таки эту задачу генералов решить не вероятностно (что согласованность получена с большой вероятностью) а точно? Поможет ли введение ответственного в принятии решений? И таки перевод средств из одной системы в другую (когда нет локальных транзакций, скажем так) по ненадежному каналу связи — решен вероятностно или же существует точное решение?
Еще раз, см. доказательство неразрешимости задачи о двух генералах. При любом кол-ве посредников будет минимальный набор сообщений между ними, обеспечивающий синхронную атаку генералов. И отсутствие гарантии доставить минимальный набор сообщений.
На деле же, хотя банки и гарантируют перевод в 3 дня, вполне могут деньги потерять и найти через месяц-другой, а то и пол года.