Итак, в основном есть игра, в которой вы владеете планетой, отправляете корабли на другие планеты, и через некоторое время вы можете владеть этой новой планетой.
PlanetB подвергается нападению с кораблем:
[PlanetA] ----> [PlanetB]
Процесс прибытия судна при завоевании PlanetB следующий:
- Предыдущий владелец PlanetB должен вернуть деньги владельцу PlanetA (одна транзакция в дБ T0)
- Теперь владелец PlanetA должен создать новый депозит (одна транзакция в дБ T1)
- Только если предыдущая транзакция прошла успешно, мы можем изменить владельца PlanetB на владельца PlanetA
Обратите внимание, что транзакции выполняются на другом сервере, и я не могу объединить их в одну транзакцию.
В основном деньги и депозиты хранятся в базе данных, поскольку они важны (на сервере A), но игровые планеты и корабли находятся в памяти (на сервере B).
Итак, вопросы:
Что делать, если T0 не работает из-за ошибки базы данных, например, я получаю слишком много ошибок соединения.? Я мог бы проигнорировать это, но это не хорошо, потому что владелец PlanetA не получит деньги новой принадлежащей планеты.
То же самое для T1, транзакция завершается неудачно из-за какой-то странной ошибки соединения с БД. Игрок даже не получит свою планету. Нужно будет отправить еще один корабль, чтобы повторить попытку, что не оптимально.
Я должен повторять это снова и снова, до тех пор, пока он не сможет остановить этот корабль на долгое время.