Auto Transaction Failsafe, API di terze parti, file di pianificazione Coldfusion

1

Dispongo di un'app web di fatturazione automatica e sto cercando di creare alcune eccezioni e una struttura che, in nessuna circostanza, consentirà una doppia fatturazione.

Tutto funziona perfettamente, l'attività pianificata viene eseguita e tutto si carica come dovrebbe. Ma ci sono alcuni scenari che sappiamo che possono causare problemi.

Ho avuto un server DB nel mezzo di un processo, che ha portato a una serie di addebiti duplicati. Inoltre, se per qualsiasi motivo, il file deve essere controllato in un browser, uno sviluppatore esegue l'aggiornamento prima che l'elaborazione del file venga completata, si verificheranno addebiti duplicati.

Ci sono alcuni scenari simili da proteggere contro, quindi puoi vedere la necessità di un modo per gestire questo dato la sensibilità delle transazioni (immagini che vedono la tua compagnia elettrica addebitare automaticamente due volte sul tuo estratto conto).

Configurazione attuale:

  • Query

  • API POST per transazione

    <!--- Parse Reply String --->
    if response = "1"
    
     - Insert Into Payments
    
     - Update Invoice Amount Due
    
     - Insert Into Transactions
    
     - Email Accepted Notification
    
    else
    
     - Email Declined Notification
    

Ci sono alcuni processi più piccoli che avvengono tra alcuni di questi, oltre a un bel po 'di istruzioni if, ma quelle sono le parti di sollevamento pesanti.

Quello che mi piacerebbe sapere e conoscere è quale sarebbe il modo migliore per gestire la salvaguardia di ciò considerando l'API di terze parti per il gateway che si trova lì?

Come lo romperesti?

Un'idea che avevo era di contrassegnare ogni processo dopo che è stato eseguito per dare un registro di dove si trovava quando ha fallito e costruire la query per gestirla di conseguenza. Non sei sicuro di quanto sia efficiente o più probabile quanto sarebbe inefficiente.

    
posta Steve Ontologic 10.01.2014 - 16:18
fonte

2 risposte

2

Nei sistemi ERP complessi quando è necessario proteggere un record, di solito c'è un meccanismo di blocco in atto da qualche parte. Nella maggior parte dei sistemi questo comporta una tabella DB o un flag sul tavolo stesso.

Quindi un modo per farlo è avere una tabella (ad esempio InvEdit) che contenga l'ID della fattura. La prima cosa che fai è inserire gli id della fattura delle fatture che desideri modificare nella tabella. Successivamente si esegue il lavoro su base per fattura come una singola transazione. L'ultimo atto della transazione sarebbe rimuovere la fattura dalla tabella invEdit. Ovviamente vorrai anche cambiare qualcosa sulla fattura in modo che non venga inserita nuovamente nella tabella invEdit (ma probabilmente lo stai già facendo, aggiornando uno stato o una data o altro).

Se una transazione fallisce (perché il DB va giù o qualsiasi altra cosa) quei dati non vengono commessi e l'ID fattura rimane nella tabella invEdit. Se riesce, viene rimosso. Se il DB si interrompe OPPURE se l'elemento viene aggiornato o il server Web si arresta in modo anomalo o qualsiasi altra cosa è possibile riprendere dal punto in cui era stata interrotta, dalla "coda" fornita dalla tabella invEdit.

Questo è solo un approccio, naturalmente. Sono sicuro che gli altri possono pensare di più.

    
risposta data 09.01.2014 - 18:20
fonte
0

Se è necessario eseguire tutte le query affinché una transazione sia considerata completa, è necessario eseguire l'intera operazione in una transazione e ripristinarla se si verifica un problema. Dovresti fare qualcosa del genere:

<cftransaction action="begin">
    <cftry>

         - Insert Into Payments

         - Update Invoice Amount Due

         - Insert Into Transactions

         <cftransaction action="commit" />

        <cfcatch type = "any">
            <cftransaction action="rollback" />
            <cfrethrow />
        </cfcatch>
    </cftry>

</cftransaction>

Se tutto nei tuoi inserti, aggiornamenti, ecc avviene correttamente, allora la transazione si impegna. Se ci sono errori, la transazione verrà ripristinata, altrimenti il commit non avverrà mai.

La transazione dovrebbe anche bloccare la tabella in modo che eventuali richieste di modifica debbano essere bloccate. Prima di iniziare a fare gli inserti e gli aggiornamenti dovresti avere un controllo per assicurarti che dovrebbe essere fatto.

    
risposta data 10.01.2014 - 17:22
fonte

Leggi altre domande sui tag