Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

LINQ-to-SQL: primo esempio di Optimistic Concurrency

Una situazione che può verificarsi lavorando con LINQ-to-SQL è che più utenti connessi a un database possano inviare cambiamenti al database stesso, sollevando così dei conflitti.

LINQ-to-SQL risolve la problematica sfruttando la cosiddetta Optmistic Concurrency. Sfruttando l’eccezione ChangeConflictException, è possibile determinare la modalità di gestione dell’invio dei cambiamenti al database da parte dei vari utenti. Considerate il seguente esempio di codice, in cui un primo utente predispone aggiornamenti per un prodotto nel database Northwind, un secondo utente predispone aggiornamenti al medesimo prodotto e li invia al database, il primo utente invia i propri cambiamenti al database:

    Sub Main()

 

        'Altra istanza del DataContext

        Dim nuovoUtenteDc = New NorthwindDataContext()

 

        'Ottengo la row relativa al prodotto "Tofu"

        Dim prodotto = dc.Products.First(Function(p) p.ProductID = 14)

 

        'Ottengo la row relativa al prodotto "Tofu"

        Dim prodottoNuovoUtente = nuovoUtenteDc.Products.First(Function(p) p.ProductID = 14)

 

        'Il secondo utente invia delle modifiche al database

        prodottoNuovoUtente.UnitPrice = 22.5D

        prodottoNuovoUtente.UnitsInStock = 20

        nuovoUtenteDc.SubmitChanges()

 

        'Poi le invia anche il primo utente

        prodotto.UnitPrice = 24.05D

        prodotto.UnitsOnOrder = 40

 

        Try

            'L'utente originario prova a inviare i cambiamenti

            dc.SubmitChanges()

 

        Catch c As ChangeConflictException

            'Mantiene i valori correnti

            dc.ChangeConflicts.ResolveAll(RefreshMode.KeepCurrentValues)

            dc.SubmitChanges()

        End Try

 

    End Sub

Nel momento in cui il primo utente richiede la persistenza dei dati, viene sollevata una ChangeConflictException, poiché i valori del database sono stati aggiornati dall’ultima lettura del client. Esistono diversi modi messi a disposizione da LINQ per gestire questo tipo di eccezione, sfruttando il metodo ResolveAll  della proprietà ChangeConflicts appartenente al DataContext. Nell’esempio di cui sopra si utilizza il valore KeepCurrentValues dell’enumerazione RefreshMode, che permette di persistere gli ultimi dati inviati in ordine di tempo (quindi, nel frangente, quelli relativi al primo utente).

In altri post vedremo altre possibilità di gestire l’eccezione.

Alessandro

Print | posted on martedì 13 maggio 2008 10:24 | Filed Under [ Visual Basic LINQ ]

Powered by:
Powered By Subtext Powered By ASP.NET