Quali sono i pericoli legati all'impostazione di un timeout di vita illimitato della transazione del database?

0

Abbiamo un processo che può durare tra pochi secondi e alcuni minuti. Pertanto, possiamo aggiornare solo alcuni record o migliaia di essi. Il processo può essere eseguito solo quando tutto è stato eseguito correttamente.

Recentemente abbiamo iniziato a riscontrare problemi durante il tentativo di eseguire il commit della transazione poiché erano contrassegnati come "rollbackOnly". Ho scoperto che in effetti la transazione era stata contrassegnata come "rollbackOnly" perché era scaduta un po 'prima (non è chiaro per vedere nei file di registro come il nostro server delle applicazioni è Websphere e il suo gestore delle transazioni fornisce solo un avvertimento su una riga) e come tale non potrebbe essere commesso. Ovviamente è logico che non sia possibile eseguire il commit di una transazione scaduta.

Il problema è infatti che non impostiamo mai il timeout della transazione nelle definizioni delle transazioni e che in tal caso il valore del timeout è quello impostato a livello del server delle applicazioni (vedere Impostazioni della transazione di Websphere, il paragrafo su" Totale timeout della durata della transazione "). Quel valore è 2 minuti e a volte lo eccediamo.

Ora, questo spiega l'impostazione (e nel caso qualcuno incontri una transazione "rollbackOnly", ho fornito qui una possibile spiegazione).

Sono tentato di aumentare il timeout, ma ho anche visto nella documentazione che il timeout può essere impostato su 0, il che significa che non c'è timeout .

Pertanto, la mia domanda è: quali sono i pericoli legati all'impostazione di un timeout di durata della transazione illimitato ?

Si noti che sono a conoscenza delle soluzioni di database / programmatiche per il mio problema, come ad esempio lavorare su tabelle temporanee e invertire i dati dalle tabelle temporanee alle tabelle reali quando sappiamo che tutto è stato fatto correttamente (usando PL / SQL per esempio ). Sono solo curioso della cosa del timeout della transazione.

    
posta Jalayn 09.11.2011 - 08:59
fonte

4 risposte

2

La maggior parte dei database non ha il rilevamento automatico del deadlock, quindi il timeout è l'unico modo per fermarli. Un timeout danneggia anche le transazioni di lunga durata, ma senza questo, il primo deadlock interromperà la tua applicazione.

    
risposta data 09.11.2011 - 09:24
fonte
1

Il problema è che puoi bloccare le risorse per molto tempo. Anche se i blocchi di riga non vengono inoltrati ai blocchi di tabelle, si rischia di bloccare gruppi di record nelle tabelle e in tutti gli indici associati, il che può impedire ad altri processi di accedervi. E se il tuo programma si blocca o viene ucciso senza chiudere la connessione, quelle tabelle potrebbero essere bloccate per ore.

Potresti provare ad aumentare il timeout per (dire) cinque minuti e vedere se questo aiuta, ma sarei davvero cauto nel disabilitare completamente.

    
risposta data 09.11.2011 - 15:20
fonte
1

Questo è un punto laterale, ma penso che sia importante. Se si applica un'applicazione in linea con utenti live che la utilizzano, trovo strano che ci siano transazioni che richiedono l'aggiornamento di migliaia di record mentre gli utenti hanno effettuato l'accesso.

La progettazione del database può essere modificata o è consigliabile prendere in considerazione l'esecuzione di un processo batch sullo sfondo. Ti suggerisco di prenderlo in considerazione prima di cambiare le impostazioni del database.

Il pericolo di cambiare l'impostazione è come hai menzionato; gli utenti possono fare clic con il mouse o premere Invio e attendere molto tempo senza risposta. Questo non è OK in molti casi.

    
risposta data 09.11.2011 - 17:46
fonte
1

Lascia che ti risponda con una citazione:

Infinity is extremely long. Even by the time the Sun turns into a red giant (it explodes), it's still a looong way to Infinity. The average programmer dies at 72. There is simply no real-world situation, where we want to wait that long. Infinite timeout is just an absurd thing. Use an hour, day, week, month, 1 year, 10 years. But not Infinity. (source)

Pensa solo a cosa vuoi consentire ai tuoi utenti e questo dipende dalle conseguenze che ha sul sistema. Avvio di una transazione, lasciando aperto il browser Web e ... vai a pranzo? Andare a casa? Per la sera? Per il fine settimana? Per una vacanza di tre settimane? ... Quindi, imposta il tuo timeout di conseguenza.

    
risposta data 10.08.2017 - 10:21
fonte

Leggi altre domande sui tag