Объем транзакции с вызовами API
Я работаю над процессом, который распределен и зависит от некоторых внутренних операций с БД, а также от сторонних API. Я хочу использовать возможности области транзакции для отката, если в любой момент произойдет ошибка.
Вот как работает мой поток.
Процесс регистрации пользователя
- Заполняет нашу основную информацию, которая вставляется в мою базу данных, используя Dapper ORM.
- Половина заполненной информации передается сторонним API.
- В случае успешного вызова 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.
}