In ritardo, ho dovuto affrontare molte contese per il blocco delle file. La tabella in conflitto sembra essere una tabella particolare.
Questo è generalmente ciò che accade:
- Lo sviluppatore 1 avvia una transazione dalla schermata del front-end di Oracle Forms
- Lo sviluppatore 2 avvia un'altra transazione, da una sessione diversa utilizzando la stessa schermata
~ 5 minuti, il front-end sembra non rispondere. Il controllo delle sessioni mostra la contesa del blocco delle righe. La "soluzione" che tutti lanciano è uccidere le sessioni: /
Come sviluppatore di database
- Cosa si può fare per eliminare le contese di blocco delle righe?
- Sarebbe possibile scoprire quale riga di una stored procedure sta causando queste contese di blocco delle righe
- Quale sarebbe la linea guida generale per ridurre / evitare / eliminare tali problemi quali codifica?
Se questa domanda sembra troppo aperta / informazioni insufficienti, non esitare a modificare / fammi sapere - Farò del mio meglio per aggiungere alcune informazioni aggiuntive.
La tabella in questione è sotto molti inserimenti e aggiornamenti, direi che è una delle tabelle più occupate. L'SP è piuttosto complesso - per semplificare - recupera i dati da varie tabelle, li popola in tabelle di lavoro, molte operazioni aritmetiche si verificano sulla tabella di lavoro e il risultato della tabella di lavoro viene inserito / aggiornato nella tabella in questione.
La versione del database è Oracle Database 10g Enterprise Edition versione 10.2.0.1.0 - 64 bit. Il flusso della logica viene eseguito nello stesso ordine in entrambe le sessioni, la transazione non viene mantenuta aperta per troppo tempo (o almeno credo di sì) e i blocchi si verificano durante l'esecuzione attiva delle transazioni.
Aggiornamento: il conteggio delle righe della tabella è maggiore di quanto mi aspettassi, con circa 3,1 milioni di righe. Inoltre, dopo aver tracciato una sessione, ho scoperto che un paio di istruzioni di aggiornamento a questa tabella non utilizzano l'indice. Perché è così - non ne sono sicuro. La colonna a cui fa riferimento la clausola where è indicizzata. Attualmente sto ricostruendo l'indice.
COMMIT
o ROLLBACK
in un tempo ragionevole oppure b) organizzare in modo tale che le stesse persone non vogliano sempre la stessa fila allo stesso tempo.