Андрей Геннеберг писал(а):
И всё-таки, что делать, если такой обрыв случился? С точки зрения системы либо появляется голосующий, который не сделал выбора, либо появляется "ничейный" голос. В первом случае можно, конечно, решить, что ну и фиг с ним. А во втором получается проблемка: явление идентично вбросу и, по идее, это гробит всё голосование.
Такие ситуации система отслеживает. Количество голосов не может стать больше чем количество зарегистрированных подписей в голосовании.
Кстати, в описании алгоритма я это сделал неправильно. Запросы там все-таки синхронные.
- Регистрируется голосующий - на сервер отправляется запрос с подписью голосующего. Без его выбора. Возвращается ID данной записи.
- Если предыдущий запрос прошел нормально - отправляется запрос с одноразовым идентификатором пользователя и его выбором.
- Если второй запрос прошел неудачно, то вызывается процедура отката первого запроса.
- Если второй запрос прошел удачно, то вызывается процедура его подтверждения.
Конечно, если будет обрыв между первым и вторым запросом, то в базе останется неподтвержденная подпись. Но такие подписи достаточно легко обнаружить.
Также возможно что обрыв произойдет, например, между отправкой голоса и подтверждением подписи. Тут мы будем иметь ситуацию с корректной БД, но с неподтвержденной подписью. В принципе, их тоже можно корректно обработать. Например, выдать пользователю на его персональной странице предупреждение что в базе есть такие его подписи и что-бы он решил что с ними делать - подтвердить или удалить.
Андрей Геннеберг писал(а):
Но на самом деле первый вариант тоже не "ну и фиг с ним", потому что голосуют не только одиночки, но и делегаты. Если механизм голосования работает по принципу "вот мой голос и ещё мешок таких же" (пока не разобрался - ещё с базой воюю), то все эти голоса как-то обламываются. Если всё работает по принципу "follow me" и пользовательское ПО просто голосует вслед за выбранным пользователем лидером, то тоже облом, потому что лидер не выбрал (с точки зрения системы).
На самом деле тема голосования, а особенно тайных, с использованием делегирования у нас еще в зачаточном состоянии. Пока видно кучу проблем с ними связанных, но не видно решений.
Андрей Геннеберг писал(а):
В общем, вопросы такие:
- в какой последовательности отправляются запросы?
Описал выше.
Андрей Геннеберг писал(а):
каково будет состояние системы в случае, если проходит только один запрос из двух?Вполне определенное и детектируемой. Пригодное для логической обработки.
Андрей Геннеберг писал(а):
есть ли возможность "доголосовать" и тем самым восстановить равновесие и валидность системы?Думаю, в данном случае лучше удалять неподтвержденную подпись и дать возможность пользователю проголосовать еще раз. Не думаю что отдельная процедура "доголосования" это хорошая идея.
Андрей Геннеберг писал(а):
есть ли возможность автоматического восстановления валидного состояния системы (удаление непарных записей)?Удаления непарных подписей - легко. А непарных голосов быть не может - их система просто не допустит.
Андрей Геннеберг писал(а):
как разруливается ситуация, если автоматически это не делается?Надо просто дописать эту обработку. Сейчас ее еще нет, но сделать реально.
Кстати, обновите исходники и БД (БД выложу отдельно и скину ссылку). Для двухфазной процедуры описанной выше добавил там поле status в таблицу votes_voters_list. Функционально там все было для этого готово, но я почему-то не довел процедуру до логического завершения. Сегодня в процессе общения с вами доделал.