Объем транзакции с вызовами API

Я работаю над процессом, который распределен и зависит от некоторых внутренних операций с БД, а также от сторонних API. Я хочу использовать возможности области транзакции для отката, если в любой момент произойдет ошибка.

Вот как работает мой поток.

Процесс регистрации пользователя

  1. Заполняет нашу основную информацию, которая вставляется в мою базу данных, используя Dapper ORM.
  2. Половина заполненной информации передается сторонним API.
  3. В случае успешного вызова API пользователь регистрируется в нашей платежной системе через API платежных шлюзов.

Теперь вот тот случай, который меня беспокоит. Допустим, #1 и #2 успешно завершены и во время выполнения #3 это не удалось по любой причине. Будет ли область действия транзакции возвращать #1 и #2 в этом случае? Я уверен насчет № 1, но будет ли он обрабатываться и для № 2? Если нет, то каково альтернативное решение, которое я могу реализовать в этом сценарии.

2 ответа

Ты не можешь. Единственное, чего вы можете достичь - это если вызов API завершится неудачно, вы можете откатить транзакцию.

Вы никоим образом не будете контролировать то, что произошло в API.

Но это может быть сделано при взаимопонимании с некоторым кодом ошибки, скажем, если я отправлю обратно "Ошибка", что означает, что я откатился, и вы также откат

Я думаю, что этого следует избегать, то есть делать вызовы REST API частью транзакций. Но, если вам все еще нужно сделать это по какой-либо причине, вам нужно внедрить координатор транзакций самостоятельно.

В вашем случае используйте транзакцию copeSapp вокруг аккуратной вставки и вызовите API. Если что-то пойдет не так, отправьте новый запрос другому методу в API, чтобы откатить то, что вы когда-либо делали в рамках транзакции.

try {
        using (var ts = new TransactionScope())
        {
          // insert data using dapper
          // Do your API Call
          ts.Complete()
        }
   }
  catch(Exception)
  {
     // Rollback your API call. 
  }
Другие вопросы по тегам