Alternative al blocco pessimistico nelle applicazioni cluster

4

Sto ricercando alternative al blocco pessimistico a livello di database per ottenere l'isolamento della transazione in un cluster di Java di applicazioni che vanno contro lo stesso database. Sincronizzare l'accesso concorrente nel livello applicazione non è chiaramente una soluzione nella configurazione attuale poiché la stessa transazione del database può essere invocata da più JVM contemporaneamente. Al momento, siamo soggetti a occasionalmente race conditions che, a causa del optimistic locking che abbiamo in atto tramite Hibernate , causano un'eccezione StaleObjectStateException e una perdita di dati.

Ho una transazione moderatamente grande nell'ambito del mio progetto di refactoring. Descriviamolo come l'aggiornamento di una riga della tabella di livello superiore e quindi la creazione di vari inserti e / o aggiornamenti correlati a diverse delle sue entità figlio, ognuna delle quali è uno-a-molti. Vorrei assicurare un accesso esclusivo alla riga della tabella di livello superiore e tutti i bambini interessati, ma mi piacerebbe evitare il blocco pessimistico a livello di database per motivi di prestazioni.

Ha senso avviare una singola applicazione di coda messaggi (forse sincrona) in cui questo metodo potrebbe essere spostato per assicurare l'accesso sincronizzato rispetto a ciascun nodo del cluster usando il proprio, il che è un evidente rischio per le condizioni di gara? Sto menzionando questo approccio anche se non ne sono sicuro perché sia la riga della tabella di livello superiore che i suoi figli potrebbero essere aggiornati anche da altre chiamate di sistema, non solo dalla transazione menzionata. Quindi sto cercando di progettare una soluzione in cui la riga della tabella di livello superiore ei suoi figli saranno tutti in qualche modo pseudo-bloccati (isolamento esclusivo della transazione) ma a livello di applicazione e non di database.

Sono aperto a idee e suggerimenti, ho capito che questa non è una sfida molto semplice e secca.

    
posta amphibient 17.10.2013 - 18:11
fonte

1 risposta

-3

Penso che tu abbia alcune soluzioni per questo con solidità e debolezza

  1. utilizzando il servizio MQ (Message Queue) con capacità di isolamento dell'account o del ticket

  2. spostamento del comando sql di aggiornamento per durare (l'ultimo della possibile posizione) (ad esempio: facendo il comando di aggiornamento dopo aver inserito le righe figlio)

  3. utilizzando i punti di salvataggio della transazione per ridurre il tempo di blocco pessimestico

  4. aggiornamento con controllo della versione

buona fortuna

    
risposta data 26.02.2016 - 09:18
fonte

Leggi altre domande sui tag