Info su gestione concorrenze su database

mercoledì 09 maggio 2012 - 15.05
Tag Elenco Tags  VB.NET  |  .NET 3.5  |  Windows Server 2003  |  Visual Studio 2010  |  SQL Server 2008  |  Internet explorer 8.0

bryger Profilo | Newbie

Salve a tutti,
sto creando un'applicazione web di tipo gestionale nella quale gli utenti possono inserire/modificare/cancellare dati su varie tabelle.

in fase di progettazione vorrei capire qual'è il metodo migliore per gestire le concorrenze :

1-In fase di inserimento sul problema della duplicazione della chiave primaria della tabella se più utenti inseriscono contemporaneamente una riga

2-in fase di modifica se più utenti effettuano un update sulla stessa riga.

Grazie

Gluck74 Profilo | Guru

dunque, per quanto riguarda l'inserimento, vorrei qualche info in più (la chiave primaria cosa è? come è gestita? come inseriscono gli utenti?)

Per la modifica e la cancellazione, puoi agire a livello di applicazione (business), o a livello di database, con approcci Ottimistic o Pessimistic.
Ecco una serie di esempi corredati da codice pronto.

Qui due esempi su come gestire la cosa sul DB con ADO.NET
http://msdn.microsoft.com/en-us/magazine/cc163924.aspx
http://msdn.microsoft.com/en-us/library/aa0416cz.aspx

questo è un esempio pratico di come utilizzare le tecniche qui sopra con DataSet e ObjectDataSource:
http://www.c-sharpcorner.com/uploadfile/john_charles/implementing-optimistic-concurrency-control-in-Asp-Net-2-0/

Qui un esempio simile ma che utilizza una unica colonna timestamp
http://www.codeproject.com/Articles/16160/Concurrent-User-Updates-in-ASP-NET-and-SQL-Server

Qui un esempio su come agire a livello di oggetti di business (classi)
http://weblogs.asp.net/gunnarpeipman/archive/2010/08/28/managing-business-object-locks-on-application-level.aspx

Qui un piccolo esempio per gestire i lock a livello di applicazione ma in maniera un po più semplice:
http://forums.asp.net/post/4050564.aspx


Spero che tutto questo materiale ti possa essere utile.
ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

bryger Profilo | Newbie

Grazie per le informazioni.
Per quanto riguarda l'inserimento la chiave primaria è generalmente un campo numerico (tabella del tipo codice/descrizione); gli utenti hanno a disposizione una pagina nella quale inseriscono la descrizione; il servizio web che gestisce i dati dovrebbe leggere l'ultimo codice di quella specifica tabella, incrementarlo di 1 e salvare).

Gluck74 Profilo | Guru

>Grazie per le informazioni.
>Per quanto riguarda l'inserimento la chiave primaria è generalmente
>un campo numerico (tabella del tipo codice/descrizione); gli
>utenti hanno a disposizione una pagina nella quale inseriscono
>la descrizione; il servizio web che gestisce i dati dovrebbe
>leggere l'ultimo codice di quella specifica tabella, incrementarlo
>di 1 e salvare).
>
>
non ho ben capito come gestire quindi la concorrenza in inserimento.
Sul codice? sulla descrizione? su entrambi?
Comunque magari te la risolvi in modo praticamente identico all'update.


____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

bryger Profilo | Newbie

Sul codice ovviamente; il problema si presenta quando due utenti inseriscono contemporaneamente un dato sulla stessa tabella, se l'insert è molto ravvicinata potrebbe succedere che entrambi leggono il nuovo id contemporaneamente (ad esmepio l'ultimo è il 100 e viene calcolato il 101), quando vanno a fare la insert uno dei due genera l'errore di chiave duplicata....

Gluck74 Profilo | Guru

ok, quindi il codice non lo mettono loro a mano? viene calcolato ul DB?
Non puoi fare in modo che il campo diventi un Identity?

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

bryger Profilo | Newbie

Intendi il tipo di campo che si autogenera? si mi hanno consigliato di seguire questo metodo anche se non mi piace molto; ci sono altre alternative?

Gluck74 Profilo | Guru

se il codice non viene messo a mano, ma deve essere comunque un codice univoco che il sistema assegna al nuovo record, puoi fare un campo calcolato che si basa sempre però su identity:

COD00001AB dove
COD = stringa fissa
00001 = identity trasformata su 5 cifre (questo devi valutarlo in base a quali cifre potrebbe raggiungere il sistema)
AB = stringa casuale 2 caretteri

questè è solo un esempio.
Dipende dai tuoi gusti e da come si deve comportare il sistema.
In effetti se il codice deve essere un codice identificativo visibile al cliente, anche a me non piace molto un numero e basta.
Allora sul sistema mantengo comunque il campo identity (anche per le relazioni), ma a video presento il campo calcolato

ciao
____________
http://glucolo.wordpress.com
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.
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