Вы эффективно выполняете свои собственные транзакции двухфазной фиксации. Полностью надежное решение требует сотрудничества с обоих ресурсов и обычно лучше всего использовать менеджер транзакций с поддержкой 2PC.
Основная проблема заключается в том, что у вас нет защиты от сбоя собственного приложения (он играет роль менеджера транзакций) и, следовательно, нет гарантии, что вы сможете откатить это наследие.
Рассмотрим сбой вашего приложения как раз в тот момент, когда оно собиралось вызвать legcacy.Rollbock (). Теперь у вас нет записи о том, что вы были в середине «транзакции», и поэтому, когда ваше приложение возвращается, у вас нет причин идти и выполнять этот откат.
Возможные подходы:
1). Используйте true 2PC, это возможно только в том случае, если ваш WebSerice имеет транзакционные возможности (технически возможно, но практически маловероятно).
2). Терпеть риск некоторых несоответствий. Многие системы фактически делают это непреднамеренно,
3). Сделайте попытку восстановления, к которому вы стремитесь, но примите к сведению, что оно может потерпеть неудачу. Добавьте некоторую форму контрольного журнала, которая позволяет обнаруживать неопределенные результаты и, следовательно, позволяет вручную исправлять ошибки позже. Таким образом, вы могли бы добавить какую-то контрольную запись, которая позволила бы выявлять ошибочные действия. Это можно рассматривать как своего рода очень ручной подход 2PC.