Mysql
 sql >> Database >  >> RDS >> Mysql

StaleObjectStateException su aggiornamenti ad alta frequenza

Sembra che tu abbia configurato Hibernate per usare controllo ottimistico della concorrenza . Ciò significa che la tua tabella Utente ha un campo versione che Hibernate incrementa ad ogni aggiornamento di riga.

Molto probabilmente la tua transazione inizia all'inizio della richiesta HTTP e termina alla fine della risposta HTTP. Ciò significa che il processo di modifica di un utente consiste in due transazioni:una transazione per popolare il modulo web e una transazione per salvare le modifiche.

In tal caso, la modifica del livello di isolamento del database non servirà a nulla. Molto probabilmente tutto ciò che otterrai è prestazioni e scalabilità peggiori .

Non è una brutta cosa avere StaleObjectException S. Riflette il mondo reale:le persone effettivamente lavorano sulla stessa cosa di tanto in tanto e possono verificarsi conflitti. La domanda è:quando viene rilevato un conflitto, come lo si risolve in modo soddisfacente per gli utenti finali? Può essere risolto senza l'assistenza dell'utente?

Possibili strategie potrebbero essere

  • sovrascrivi le modifiche dell'utente precedente (spesso non quelle che desideri, da qui la necessità del controllo della concorrenza),

  • mostra un messaggio di errore che chiede all'utente di aggiornare ed eseguire nuovamente le modifiche,

  • unire automaticamente le modifiche senza sovrascrivere le modifiche dell'utente precedente (a volte possibile)

  • informare l'utente della obsolescenza dei suoi dati e offrirgli un modo per unire manualmente le sue modifiche

Tutto dipende dal contesto.