Annullare operazioni db nel caso di errore

mercoledì 25 giugno 2014 - 18.16
Tag Elenco Tags  C#  |  .NET 4.0

Gemini Profilo | Expert

Ciao a tutti
devo scrivere una procedura che deve salvare una serie di dati sul database.
Per far questo eseguo diverse insert. Vorrei alla fine, nel caso si verifichi un errore, annullare tutte le operazioni che ho eseguito.
Sto provando con TransactionScope, ma sul server ho errore nel caso ho TransactionScope annidati.
Come posso evitare questo? Ci sono alternative a TransactionScope?
Grazie mille

alx_81 Profilo | Guru

>Ciao a tutti
ciao

>Per far questo eseguo diverse insert. Vorrei alla fine, nel caso
>si verifichi un errore, annullare tutte le operazioni che ho eseguito.
ci sono logiche particolari oppure puoi passare da un set di dati e fare INSERT da una SELECT su di una tabella passata?
Con una sola insert, in caso di errore, la rollback di tutto è implicita.

>Grazie mille
di nulla!
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

Gemini Profilo | Expert

Ciao e grazie
non mi è chiaro quello che mi hai scritto.
Puoi inviarmi esempi o link dove studiare?
Grazie

alx_81 Profilo | Guru

>non mi è chiaro quello che mi hai scritto.
>Puoi inviarmi esempi o link dove studiare?
provo a spiegarmi meglio..
devi fare per forza un ciclo e per ogni loop fare una sola insert, oppure puoi passare, ad esempio ad una stored procedure (ma puoi usare anche T-SQL semplice) una tabella con i dati da inserire tutti in una volta?
O ancora, i dati li puoi andare a prendere da una tabella (SELECT) per poter poi inserire tutto nella tua destinazione?
puoi fare le cose che ti ho indicato o sei costretto a fare il ciclo? Cosa ti costringe a fare un ciclo se è così? Giusto per capire se possiamo invertire un po' il punto di vista.
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

Gemini Profilo | Expert

Ciao
è un piccolo e-commerce. Quindi, mi salvo prima i dati del cliente, poi l'ordine e poi i dettagli dell'ordine.
Se in una di queste fasi si verifica un errore, devo annullare tutti i dati inseriti. Prima eseguito tutte queste operazioni a mano, nel senso che scrivevo del codice per cancellare tutti i dati dal db.

alx_81 Profilo | Guru

>è un piccolo e-commerce. Quindi, mi salvo prima i dati del cliente,
>poi l'ordine e poi i dettagli dell'ordine.
>Se in una di queste fasi si verifica un errore, devo annullare
>tutti i dati inseriti. Prima eseguito tutte queste operazioni
>a mano, nel senso che scrivevo del codice per cancellare tutti i dati dal db.
Allora puoi fare una stored procedure che si aspetta tre parametri:
- dati dell'utente
- dati dell'ordine
- tabella con i dettagli dell'ordine

La stored procedure mette tutto sotto transazione (con SET XACT_ABORT ON in testa) e se la transazione non va bene per tutto hai la rollback implicita, che oltre tutto restituisce al chiamante l'errore che puoi trappare e gestire.


Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

andrestu Profilo | Expert

scusate se mi intrometto nella discussione ma leggendo vorrei fare una domanda aggiuntiva ad Alex.
"SET XACT_ABORT ON" dove va messo all'interno della SP?
prima della insert ma dopo la definizione dei parametri?
nel caso in cui la SP non sia impostata con "SET XACT_ABORT ON" come si comporta, non fa il rollback in caso di errore?
chiedo perchè io ho diverse SP ma nessuna impostata con "SET XACT_ABORT ON"...
grazie

Andrea Restucci - Web Developer

alx_81 Profilo | Guru

>"SET XACT_ABORT ON" dove va messo all'interno della SP?
non è che va messo, è un setting di sessione.. e in quanto tale, serve nella sessione in cui lo vuoi mettere.

>prima della insert ma dopo la definizione dei parametri?
siccome agisce sulle transazioni successive al set, dove ti è più comodo (a me piace in alto, se è uno solo, perchè lo vedo subito).

>nel caso in cui la SP non sia impostata con "SET XACT_ABORT ON"
>come si comporta, non fa il rollback in caso di errore?
comunque prendi eccezione, ma, per quei casi in cui la rollback non è prevista, essa non viene fatta. Inoltre, se in un processo sotto transazione ci si è interrotti a metà, la transazione non viene chiusa.

>chiedo perchè io ho diverse SP ma nessuna impostata con "SET XACT_ABORT ON"...
Non è necessario, dipende da come vuoi gestire le cose.
Invece cerca di mettere SET NOCOUNT ON.. quello è importante.

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi

andrestu Profilo | Expert

SET NOCOUNT ON
questo lo mette in automatico quando creo una nuova SP, ma a che serve?

Andrea Restucci - Web Developer

alx_81 Profilo | Guru

>questo lo mette in automatico quando creo una nuova SP, ma a che serve?
Ecco la documentazione: http://msdn.microsoft.com/it-it/library/ms189837.aspx
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://blogs.dotnethell.it/suxstellino
http://suxstellino.wordpress.com
http://mvp.microsoft.com/profiles/Alessandro.Alpi
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5