Ottenere una visione coerente dello stato dei dati

3

Ecco un problema teorico. Potrebbe essere applicato a molti sistemi. Supponiamo che i servizi Web RESTful, ad esempio. Vuoi scoprire qualcosa ma, come succede, non puoi ottenerlo in una singola query. Puoi fare più domande. Ad esempio, hai un conto bancario congiunto (o un conto bancario della società) e vuoi scoprire quanti soldi ci sono. Nel frattempo qualcun altro trasferisce denaro dal controllo al risparmio.

Checking:  $5,000   Savings:  $3,000

Me: Query Checking. Response: $5,000

Joe: Transfer $4,000 from Checking to Savings

Checking: $1,000   Savings:  $7,000

Me: risparmi sulle query. Risposta: $ 7.000

Totale $ 12.000.

Come si evitano anomalie come questa? L'esempio mostra due account in una banca, ma può anche succedere con due account in due banche diverse.

    
posta Mark Lutton 23.09.2010 - 17:58
fonte

3 risposte

3

Hai bisogno di qualche forma di controllo della concorrenza per affrontare problemi come questo.

Alcune possibili soluzioni nel tuo esempio:

  1. Assicurati che il servizio possa restituire sia i dati di risparmio che quelli di controllo in una singola query, magari come totale.
  2. Implementare un tipo di sessione in modo che l'utente che richiede i valori possa bloccare i dati finché non ha terminato di leggere tutti i valori a cui è interessata. Questo approccio è spesso chiamato "controllo della concorrenza pessimista".
  3. Progettare il servizio in modo da poter passare la precedente figura di controllo quando si richiede una cifra di risparmio. Se la figura Checking non corrisponde più al suo valore precedente, il servizio dovrebbe indicare un errore piuttosto che restituire un valore per Risparmio. Questo approccio è una variazione del "controllo della concorrenza optomistica".
risposta data 23.09.2010 - 18:23
fonte
0

Supponendo che questa sia un'API sicura, puoi consentire a un solo utente di visualizzare / modificare un account in qualsiasi momento. Quindi le credenziali potrebbero assomigliare a questo:

    User: Joe
    Password: dog
    Account: Z123456X

Una volta che l'utente accede a un blocco a tempo, viene avviato e ripristinato con ogni query all'API. Se si disconnettono, il blocco è completamente rimosso. Se questo è impossibile, allora non c'è molto che tu possa fare. Ci saranno sempre condizioni di gara quando si gestiscono dati come questo. Il meglio che puoi fare quando qualcuno interroga l'API è restituire il valore attuale e il valore in sospeso basato su eventuali transazioni in sospeso. Ciò minimizza la possibilità di dati obsoleti.

    Actual: $5,000 
    Pending: $1,000
    
risposta data 23.09.2010 - 18:26
fonte
0

Questo è il motivo per cui ci sono processi che indicano attività cancellate e in sospeso. Proprio come se tu avessi sia il prelievo che il deposito nella stessa transazione, i saldi devono essere co-associati e indicare che ci sono trasferimenti in sospeso, quindi tutti i saldi potrebbero non essere disponibili.

    
risposta data 23.09.2010 - 19:49
fonte

Leggi altre domande sui tag