Qual è l'utilità delle transazioni in un batch (in particolare un batch di primavera)?

0

Capisco cosa è una transazione in un'applicazione web, dove ci sono alcuni gruppi di interazioni di database che devono fallire o avere successo insieme, quindi il database è sempre in uno stato coerente.

Ma perché un framework come Spring Batch è costruito attorno alle transazioni? Il mio gruppo di record impegnati non è un gruppo logico (la dimensione di questo gruppo è impostata usando la proprietà commit-interval): non è un problema se uno fallisce e gli altri hanno successo. E, al contrario, se il mio intervallo di commit è 100, qual è lo scopo di ripristinare 100 operazioni indipendenti quando si fallisce?

Se la mia domanda non è abbastanza chiara, facciamo un esempio: ho un lavoro con pochi passaggi, e ogni passaggio principale riguarda l'analisi di alcuni file xml e l'inserimento di frammenti in DB. Cosa succederà se tutti questi passaggi non vengono eseguiti in nessuna transazione e qualsiasi lettura / elaborazione / scrittura non riuscita genera un'eccezione rilevata e produce solo alcuni registri? Cosa sto perdendo facendo così?

La migliore risposta che ho trovato fino ad ora è: le transazioni batch non sono transazioni logiche, riguardano le prestazioni, non è possibile elaborare l'articolo in blocchi senza transazioni, è vero?

Capisco come impostare le transazioni e ho già scritto alcuni lavori, la mia domanda non riguarda "come" ma "perché".

    
posta Tristan 02.05.2015 - 08:43
fonte

1 risposta

2

In primo luogo, i database transazionali in genere non consentono di scrivere i dati "senza transazioni" - qualsiasi tipo di accesso in scrittura sarà incluso in una transazione. Dal punto di vista del database, un'operazione di scrittura è solo un'operazione di scrittura per cui è necessario garantire l'integrità dei dati. Se è causato da un processo batch, un processo OLTP o una combinazione di entrambi non ha importanza.

Inoltre, non è troppo difficile immaginare un processo batch in cui devi inserire i dati nelle due tabelle, con una relazione master-figlio tra loro, e vuoi assicurarti che un master viene inserito il record, anche i record figlio relativi verranno inseriti completamente e quando l'inserimento di un record figlio non riesce, il record principale non verrà inserito affatto. Quindi, contrariamente al caso in cui inserisci dati solo in una tabella e ogni INSERT è un'operazione atomica, ora devi considerare un gruppo di INSERT come un'operazione atomica.

Per tale processo, è ancora possibile inserire 100 record nella tabella principale e tutti i record figli correlati all'interno della stessa transazione. Ma sicuramente dovrai evitare di posizionare il COMMIT da qualche parte nel posto sbagliato tra l'INSERT di un record master e i relativi record figlio. Quindi i tuoi COMMIT devono rispettare la relazione logica dei tuoi dati in questo caso.

Un altro scenario: se il vostro processo batch ha bisogno di fare un registro dettagliato su quale INSER non è riuscito e quali sono riusciti, potrebbe essere necessario racchiudere ogni gruppo atomico logico di inserti in una singola transazione. Questo potrebbe anche essere vero se hai un solo tavolo da riempire. Puoi pensare di ottimizzarlo cercando prima di inserire i tuoi dati in blocchi di 100, e se ciò fallisce, provi di nuovo ad inserire i tuoi dati uno per uno, ma almeno per il secondo passo, devi tagliare le tue transazioni logicamente corretto.

    
risposta data 02.05.2015 - 12:21
fonte

Leggi altre domande sui tag