Oracle
 sql >> Database >  >> RDS >> Oracle

contesa di righe Oracle che causa errori di deadlock nell'applicazione JMS a velocità effettiva elevata

Un deadlock implica che ogni thread sta tentando di aggiornare più righe in una singola transazione e che tali aggiornamenti vengono eseguiti in un ordine diverso tra i thread. La risposta più semplice possibile, quindi, sarebbe quella di modificare il codice in modo che i messaggi all'interno della stessa transazione vengano applicati in un ordine definito (cioè nell'ordine della chiave primaria). Ciò assicurerebbe di non ottenere mai un deadlock anche se avresti comunque dei blocchi di blocco mentre un thread attende che un altro thread esegua la transazione.

Facendo un passo indietro, tuttavia, sembra improbabile che tu voglia davvero che molti thread aggiornino la stessa riga in una tabella quando non puoi prevedere l'ordine degli aggiornamenti. Sembra molto probabile che ciò porterebbe a molti aggiornamenti persi e ad alcuni comportamenti piuttosto imprevedibili. Cosa sta facendo esattamente la tua applicazione che renderebbe questo genere di cose sensate? Stai facendo qualcosa come aggiornare le tabelle aggregate dopo aver inserito le righe in una tabella dei dettagli (ovvero aggiornare il conteggio del numero di visualizzazioni di un post oltre a registrare le informazioni su una vista particolare)? In tal caso, queste operazioni devono davvero essere sincrone? Oppure potresti aggiornare periodicamente il conteggio delle visualizzazioni in un altro thread aggregando le visualizzazioni negli ultimi N secondi?