Как работать с транзакциями в веб-сервисах RESTful?

Клиент REST выполняет последовательность шагов с сервером в потоке. Клиент хотел бы отменить поток и отменить все изменения, внесенные в данные в этом потоке.

Например, у нас есть метод ниже. В нем есть три разных шага. Первые два — это остальные вызовы, а третий — вставка данных. Теперь, если restCall1(), restCall2() выполнены успешно, но третий шаг не выполнен. Все, что было сделано в первых двух шагах, должно быть возвращено обратно.

method(){
    restCall1(); // Rest Call to the server, perform DB operations
    restCall2(); // Rest call to the server, perform file operations 
    insertData(); // Perform DB operations
} 

Что является наилучшей практикой для решения этой проблемы с транзакциями. Один из способов — создать собственную структуру транзакций и шаги отката. Есть ли какой-либо фреймворк/инструмент, который может решить эту проблему?


person Narendra Verma    schedule 29.11.2016    source источник


Ответы (1)


Клиент REST может поддерживать только свое собственное состояние в вызове REST, и нет синхронизации между состоянием клиента REST и ресурсами, управляемыми сервером. Вам придется поддерживать синхронизацию между различными вызовами REST к веб-службе, что нарушает связь без сохранения состояния. Если вы намереваетесь сделать это, вы должны поддерживать синхронизацию состояний между различными вызовами REST и соответствующим образом координировать свои действия.

Подробнее здесь

Однако есть обходные пути.Ретро — это модель, которая поддерживает транзакции для REST подверженным ошибкам и масштабируемым способом. См. также это. Надеюсь, это поможет.

person Ankit Tripathi    schedule 29.11.2016
comment
Я понимаю вашу точку зрения. Но это распространенный вариант использования. Я подумал, помимо разработки нашей собственной стратегии отката, есть ли какие-нибудь передовые методы для решения этой проблемы? - person Narendra Verma; 29.11.2016
comment
Выполнение транзакций с REST - не лучшая практика. Однако есть обходной путь. Я отредактировал свой ответ. - person Ankit Tripathi; 29.11.2016
comment
Хорошо, так как справиться с этой проблемой? Есть идеи? - person Narendra Verma; 29.11.2016
comment
Я не совсем согласен с вашим утверждением, что клиент не может сохранять состояние транзакции. Позвольте мне процитировать самого себя Филдинга : Стиль клиент-сервер без сохранения состояния происходит от клиент-сервера с дополнительным ограничением, заключающимся в том, что в серверном компоненте не допускается состояние сеанса. Каждый запрос от клиента к серверу должен содержать всю информацию, необходимую для понимания запроса, и не может использовать какой-либо сохраненный контекст на сервере. Состояние сеанса полностью сохраняется на клиенте. - person MaVVamaldo; 29.11.2016