Да предположим, че имам SQL транзакционна финансова система, но по време на транзакция тя извиква външна не-SQL услуга.
Как да се справите с напр. загуба на мощност, когато нямаме информация дали външното повикване е било успешно или не?
Нека си представим това в SQL база данни и биткойн портфейл, правещ транзакция.
- Стартирайте SQL транзакция
- Намалете сумата на потребителя в брой
- Изпратете пари в брой на потребителя някъде чрез биткойн портфейла
- Ангажирайте се
Загубата на захранване между стъпка 3 и 4 ще попречи на извършването на транзакция (няма намаляване на парите на потребителя), но всъщност ще изпрати нашите пари от портфейла.
Вторият сценарий е да се намалят парите на потребителя и да се ангажира, преди да се обади на външна услуга. Но когато настъпи загуба на захранване след повреда на външна услуга (всъщност не са изпратени) пари, ние не го правим, за да върнем средствата на потребителя след повреда на външната услуга (да предположим, че биткойн портфейлът не работи).
В момента намалявам парите и маркирам транзакцията като „в ход“ (и я ангажирам) преди повикване към външна услуга, след това, ако външната услуга отговори ОК, маркирам всичко като успешно завършено.
Но при загуба на захранване все още мога да остана в ситуация, че някоя транзакция след загуба на захранване е маркирана като „в процес“, парите са намалели, но трябва да проверя ръчно транзакциите в биткойн портфейл/блокчейн, ако парите наистина са били изпратени.
Има ли по-добър начин за управление на транзакции в тази ситуация? Възможно ли е да се реши по някакъв начин, без да е възможно да се провери в бъдеще дали нашето външно обаждане е било успешно или не? (като мога да проверя всички минали транзакции в блокчейн)