Транзакции в REST? - PullRequest
       58

Транзакции в REST?

139 голосов
/ 29 сентября 2008

Мне интересно, как бы вы реализовали следующий вариант использования в REST. Можно ли вообще обойтись без ущерба для концептуальной модели?

Чтение или обновление нескольких ресурсов в рамках одной транзакции. Например, переведите 100 долларов с банковского счета Боба на счет Джона.

Насколько я могу судить, единственный способ реализовать это - обман. Вы можете отправить POST к ресурсу, связанному с Джоном или Бобом, и выполнить всю операцию, используя одну транзакцию. Насколько мне известно, это нарушает архитектуру REST, потому что вы, по сути, туннелируете вызов RPC через POST, а не работаете с отдельными ресурсами.

Ответы [ 13 ]

1 голос
/ 05 июля 2013

Вы не должны использовать транзакции на стороне сервера в REST.

Одно из ограничений REST:

Stateless

Связь клиент-сервер дополнительно ограничена тем, что между запросами не сохраняется клиентский контекст на сервере. Каждый запрос от любого клиента содержит всю информацию, необходимую для обслуживания запроса, и любое состояние сеанса сохраняется на клиенте.

Единственный способ RESTful - создать журнал повторных транзакций и перевести его в состояние клиента. С запросами клиент отправляет журнал повторов, а сервер повторяет транзакцию и

  1. откатывает транзакцию назад, но предоставляет новый журнал повторных транзакций (на шаг вперед)
  2. или, наконец, завершите транзакцию.

Но, возможно, проще использовать технологию, основанную на сеансах сервера, которая поддерживает транзакции на стороне сервера.

0 голосов
/ 08 октября 2010

В простом случае (без распределенных ресурсов) вы можете рассматривать транзакцию как ресурс, где процесс ее создания достигает конечной цели.

Таким образом, для перевода между <url-base>/account/a и <url-base>/account/b вы можете отправить следующее в <url-base>/transfer.

<transfer>
    <from><url-base>/account/a</from>
    <to><url-base>/account/b</to>
    <amount>50</amount>
</transfer>

Это создаст новый ресурс передачи и вернет новый URL перевода - например, <url-base>/transfer/256.

В момент успешной публикации на сервере выполняется «реальная» транзакция, а сумма удаляется с одного аккаунта и добавляется к другому.

Это, однако, не распространяется на распределенную транзакцию (если, скажем, «a» хранится в одном банке за одной службой, а «b» - в другом банке за другой службой) - за исключением того, чтобы сказать «попытаться» формулировать все операции способами, не требующими распределенных транзакций ".

0 голосов
/ 29 сентября 2008

Полагаю, вы можете включить TAN в URL / ресурс:

  1. PUT / транзакция для получения идентификатора (например, «1»)
  2. [PUT, GET, POST, что угодно] / 1 / account / bob
  3. [PUT, GET, POST, что угодно] / 1 / счет / счет
  4. УДАЛИТЬ / транзакция с ИД 1

Просто идея.

...