Operazioni su database all'interno di un try catch

mercoledì 31 agosto 2011 - 12.21

andrestu Profilo | Expert

Nel progettare un sito web sono incappato in un dubbio:
Volevo un parere sul fatto di eseguire all'interno di un try catch qualsiasi operazione effettuata dagli utenti su Database, vorrei fare ciò per poter gestire nel catch qualsiasi tipo di errore.
La domanda cruciale è:
se le operazioni effettuate dagli utenti sono tante ne può conseguire un degradamento delle prestazioni rispetto a non inserire il codice nel try ?


Andrea Restucci - Web Programmer
www.andrearestucci.name
Download and try my FREE custom controls !!!

alx_81 Profilo | Guru

>Nel progettare un sito web sono incappato in un dubbio:
>Volevo un parere sul fatto di eseguire all'interno di un try
>catch qualsiasi operazione effettuata dagli utenti su Database,
>vorrei fare ciò per poter gestire nel catch qualsiasi tipo di
>errore.
>La domanda cruciale è:
>se le operazioni effettuate dagli utenti sono tante ne può conseguire
>un degradamento delle prestazioni rispetto a non inserire il
>codice nel try ?
Ciao, non la butterei sulla problematica che poni, piuttosto sul fatto che va gestita molto bene l'eventuale transazione.
Non è che un try catch ti isola le transazioni, e se devi fare più operazioni one shot, devi studiarti bene l'utilizzo dell'oggetto TransactionScope (http://msdn.microsoft.com/it-it/library/system.transactions.transactionscope(v=vs.80).aspx).Diciamo che puoi usare unitamente il TransactionScope e il try catch (con le opportune using).
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

andrestu Profilo | Expert

potresti spiegarmi meglio in poche parole a cosa serve un gestore di transazioni in relazione al contesto in cui un sito web aspnet viene utilizzato da più utenti contemporaneamente e ognuno di questi effettua chiamate al database? serve a ottimizzare la gestione della memoria?




Andrea Restucci - Web Programmer
www.andrearestucci.name
Download and try my FREE custom controls !!!

alx_81 Profilo | Guru

>potresti spiegarmi meglio in poche parole a cosa serve un gestore
>di transazioni in relazione al contesto in cui un sito web aspnet
>viene utilizzato da più utenti contemporaneamente e ognuno di
>questi effettua chiamate al database? serve a ottimizzare la
>gestione della memoria?
no, serve a fare in modo che eventuali operazioni in concorrenza debbano avere un livello di isolamento rispetto ad altre che cercano di accedere alla stessa risorsa.
Inoltre serve a rendere atomica un'operazione di più statement per gestire le eventuali rollback in modo corretto.
Per esempio, se dovessi fare una insert, e poi un'update in cui devi gestire "O TUTTO O NIENTE" una transazione ti permette di essere consistente sia prima, sia durante, sia dopo l'esecuzione di quei comandi.
Supponi che l'update non vada a buon fine, con una transazione ben disegnata puoi fare rollback anche della insert, facendo in modo che durante il lock esclusivo applicato, gli altri processi simili in concorrenza aspettino per mantenere la consistenza del tuo database. Questo è molto importante qualora tu avessi operazioni complesse da eseguire interamente o da "rollbackare" interamente in caso di errore.
Inoltre, siccome la transazione può avere un livello di isolamento query per query (e se vuoi anche tabella per tabella), puoi aumentare le performance laddove il lock applicato sulla risorsa può essere più "leggero" e non bloccante (nei confronti degli altri processi in concorrenza).
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

andrestu Profilo | Expert

se hai un attimo di pazienza vorrei alcune delucidazioni, scusa l'ignoranza ma su diverse cose mi sfuggono i meccanismi di base:

>no, serve a fare in modo che eventuali operazioni in concorrenza
>debbano avere un livello di isolamento rispetto ad altre che
>cercano di accedere alla stessa risorsa.

normalmente in caso di operazioni multiple su DB cosa succede (sia che siano select o insert o update o stored procedure) vengono eseguite in sequenza e non in simultanea?
e cioè se utente A fa un select su una tabella e un istante prima utente B fa un insert sulla stessa tabella, l'utente A eseguirà il select solo una volta terminato l'insert dell'utente B? In questo caso l'operazione di select viene rallentata se ci sono molti utenti che eseguono lo stesso select...
il blocco avviane a livello di connection?, e cioè al db viene connesso un utente alla volta e nel tempo di attesa il thread viene messo in sospensione?
Cosa intendi con "livello di isolamento"?

>Inoltre serve a rendere atomica un'operazione di più statement
>per gestire le eventuali rollback in modo corretto.
>Per esempio, se dovessi fare una insert, e poi un'update in cui
>devi gestire "O TUTTO O NIENTE" una transazione ti permette di
>essere consistente sia prima, sia durante, sia dopo l'esecuzione
>di quei comandi.
>Supponi che l'update non vada a buon fine, con una transazione
>ben disegnata puoi fare rollback anche della insert, facendo
>in modo che durante il lock esclusivo applicato, gli altri processi
>simili in concorrenza aspettino per mantenere la consistenza
>del tuo database. Questo è molto importante qualora tu avessi
>operazioni complesse da eseguire interamente o da "rollbackare"
>interamente in caso di errore.

ok quindi posso eseguire anche commandi separati, per esempio come dici tu se ho un contesto in cui prima eseguo un metodo che fa un insert e poi un metodo che fa un qualcos'altro solo nel caso che la insert vada a buon fine, in tal caso con la gestione della transazione non mi preoccupo di controllare via codice se l'insert vada a buon fine, tanto so che in caso di errore viene eseguito il rollback dell'insert giusto?

>Inoltre, siccome la transazione può avere un livello di isolamento
>query per query (e se vuoi anche tabella per tabella), puoi aumentare
>le performance laddove il lock applicato sulla risorsa può essere
>più "leggero" e non bloccante (nei confronti degli altri processi
>in concorrenza).

per esempio posso rendere più veloce un select multiplo effettuato da più utenti in modo che non blocchino la risorsa?

--------

un altra cosa ancora, ma per la gestione delle connessioni al DB se non sbaglio ho letto in qualche post (non so se proprio te davi questa indicazione) che sarebbe meglio aprirla effettuare l'operazione e chiuderla. Quindi in un contesto multiutenza (Aspnet) è meglio aprirla e mantenerla aperta per tutti per esmpio nell'evento "Application_Start" in modo che più utenti utilizzino lo stesso oggetto connection aperto oppure aprirla e chiuderla ad ogni esecuzione di un command?


Andrea Restucci - Web Programmer
www.andrearestucci.name
Download and try my FREE custom controls !!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5