Supponiamo di avere questa attività in un'applicazione composta da due parti:
1) Consegna di un file su un sistema esterno (non sotto il tuo controllo)
2) Una transazione di database nel nostro sistema, con informazioni su detta consegna (cosa è stato inviato, quando e da chi)
Se una qualsiasi di queste due parti fallisce, lo stato del nostro sistema sarà incoerente. Se un file è stato inviato e il db non ha informazioni su di esso, si tratta di un errore. Allo stesso modo, se il trasferimento del file non è riuscito, ma le informazioni nel database suggeriscono diversamente, anche questo è un errore.
Come ti avvicineresti a questa attività per assicurarti che il database sia lasciato in uno stato coerente dopo ogni volta che l'attività è tentata?
Sono inesperto nell'affrontare problemi come questo in un modo proprio - potrei sempre usare l'approccio ingenuo e far finta di scrivere sul database non fallirà mai. :-) Vorrei fare di meglio, però.
Le due variazioni di base che vedo qui lasciano a desiderare (pseudocodice):
A:
try:
commitTransaction()
deliverFile()
catch TransactionError:
// No problem, delivery was never attempted.
catch DeliveryError:
// The system will now say that it was delivered,
// even though it wasn't.
B:
try:
deliverFile()
commitTransaction()
catch TransactionError:
// The system will now say nothing was delivered,
// even though it was.
catch DeliveryError:
// Easy enough to handle:
rollbackTransaction()
Sono sicuro che esiste una soluzione accettabile e che non riesco a individuarlo?