OptimisticLockException multi-thread

2020-02-22 java sql multithreading spring-boot thread-safety

Ho più thread che leggono in una tabella. Ogni thread vuole leggere un valore dalla tabella e quindi cambiare lo stato da used = 'N' a used = 'Y' ;

Value = `Select min(myColumn) where used =’N’`

Ho messo il mio metodo come sincronizzato, ma capita che più thread leggano lo stesso valore e quando il secondo prova ad aggiornare usato su 'Y' aveva *OptimisticLockException* . E ho un problema di prestazioni quando molti thread a causa di *OptimisticLockException* . La soluzione SKIP_LOCK non è applicabile al mio caso.

Hai qualche idea per favore come posso risolvere questo problema?

Grazie

Answers

Non ho esperienza con Spring Boot, ma utilizzando JPA semplice, quando si esegue una query, è possibile impostare LockMode.

Qualcosa come questo:

query.setLockMode(LockModeType.PESSIMISTIC_WRITE);

In questo modo, l'SQL generato utilizza le funzionalità del database (normalmente significa che aggiunge un "aggiornamento" alla query SQL), per bloccare i dati selezionati, per impedire ad altri client di leggerli fino al termine della transazione.

Se si utilizza questo tipo di blocco, non è necessario utilizzare alcuna sincronizzazione a livello di metodo, poiché la concorrenza verrà controllata a livello di database.

Questo articolo spiega in modo più dettagliato l'utilizzo del blocco pessimistico in JPA: https://www.baeldung.com/jpa-pessimistic-locking

Related