2011-09-21 10 views
8

improvvisamente le query di aggiornamento non sono in esecuzione. posso fare selezionare le domande ma quando provo a l'aggiornamento registra che il database si blocca infinitamente. ho provato anche da SQL Plus e non succede nulla.Il database Oracle è sospeso all'infinito nelle query UPDATE

+1

Per favore, puoi essere più esplicito? Non c'è modo che possiamo * indovinare * cosa sta succedendo sul tuo sistema. Cosa sai? Cosa hai controllato? Come funziona il tuo sistema, quanti utenti, ecc ...? Come appare la query di aggiornamento? Che tipo di DML è in esecuzione sullo stesso tavolo allo stesso tempo? –

+0

È possibile disconnettersi e riaccenderlo? OK? Sei in modalità ARCHIVELOG? Hai modifiche non eseguite in un'altra sessione per individuare l'aggiornamento corrente? Un po 'più di informazioni sarebbe utile .... – Ollie

risposta

23

Molto probabilmente si ha un'altra transazione aperta senza commit per lo stesso set di record, quindi sono bloccati per quella transazione.

E, molto probabilmente, è bloccato, eseguendo lo stesso UPDATE in un'altra transazione.

Basta eseguire il commit/rollback delle transazioni, si dovrebbe andare bene.

+2

Ora ** quella ** risposta è quella che io chiamo un'ipotesi colta ;-) –

+3

Sì. Sì. Quando sei in giro da un po 'e istruisci i principianti, ottieni quella sensazione di "forza di forza in me" e conosci i loro problemi prima che possano dirti tutto. :) Ma non ho sempre ragione, ovviamente. –

+0

Conosco quell'atmosfera. Va bene con "non parlare più e osservare" :) –

12

Questa query ti mostrerà chi sta bloccando il tuo aggiornamento. Eseguire l'aggiornamento che si blocca, poi in un'altra sessione eseguire questo:

select s1.username || '@' || s1.machine || 
    ' (SID=' || s1.sid || ') is blocking ' 
    || s2.username || '@' || s2.machine || ' (SID=' || s2.sid || ') ' AS blocking_status 
    from v$lock l1 join v$lock l2 on (l1.id1 = l2.id1 and l2.id2 = l2.id2) 
       JOIN v$session s1 ON (s1.sid = l1.sid) 
       JOIN v$session s2 ON (s2.sid = l2.sid) 
    WHERE l1.BLOCK=1 and l2.request > 0; 

EDIT:

di attribuire correttamente questo, sembra che io cribbed questo un po 'indietro da ORAFAQ.

+0

Dovrò segnalarlo. Molto bella! –

+1

Lo uso molto. Vorrei poter ricordare dove l'ho trovato. Forse uno speciale Tom Kyte. Aggiornamento: Penso di averlo trovato qui: http://orafaq.com/node/854 – DCookie

+0

Come possiamo interrompere o uccidere l'attività risultante? – user3141985

Problemi correlati