Gestione di locking,

sabato 07 maggio 2005 - 00.10

mgianluca Profilo | Junior Member

Nella gestione della concorrenza in un DB come posso fare?
Ho un db MySql.

Supponiamo di avere 2 utenti che possono accedere ad un record.
L'utente 1 chiede i dati e li carica in un dataset disconnesso.
L'utente 2 chiede i dati e li carica a in un dataset disconnesso.
L'utente 1 effettua le sue modifice sul record ed esegue l'update.
L'utente 2 effettua le sue modifiche ed esegue l'update.

Cosa accade a questo punto? Il record su cui ha operato l'utente 2 non è più
valido in quanto è stato modificato da 1, come reagisce l'applicazione?

Potete aiutarmi?

LudovicoVan Profilo | Junior Member

Ciao gianluca,

> Supponiamo di avere 2 utenti che possono accedere ad un record.
> L'utente 1 chiede i dati e li carica in un dataset disconnesso.
> L'utente 2 chiede i dati e li carica a in un dataset disconnesso.
> L'utente 1 effettua le sue modifice sul record ed esegue l'update.
> L'utente 2 effettua le sue modifiche ed esegue l'update.

> Cosa accade a questo punto? Il record su cui ha operato l'utente 2 non è più
> valido in quanto è stato modificato da 1, come reagisce l'applicazione?

Di base, l'applicazione non "reagisce" e l'utente 2 sovrascrive il record.

Un approccio semplice ed efficace è quello di mettere un Timestamp nella tabella per riportare la data/ora di ultimo aggiornamento del record. Quando l'utente 1 scrive il record, il Timestamp viene aggiornato. Quando l'utente 2 sta per scrivere il record, prima rilegge il Timestamp del record dal db e, poiché non corrisponde più al Timestamp letto in origine, l'aggiornamento del record non viene eseguito e l'utente viene invitato a ripetere l'operazione dall'inizio...

HTH. -LV

LudovicoVan Profilo | Junior Member

P.S. Scusa, dimenticavo: la procedura che verifica il Timestamp ed eventualmente esegue l'update del record dovrebbe essere inclusa in una transazione, altrimenti il problema permane...

mgianluca Profilo | Junior Member

Puoi provare a vedere i miei file per capire come impostare la transaction e se hai qualche suggerimento in più?

mgianluca Profilo | Junior Member

Puoi provare a vedere i miei file per capire come impostare la transaction e se hai qualche suggerimento in più?

LudovicoVan Profilo | Junior Member

Conosco pochissimo MySql, ma dando un'occhiata alla documentazione mi sembra che ci siano due strade.

1) La più semplice, ma solo se hai MySql 5+:

puoi usare la funzione ROW_COUNT() per leggere il numero di righe effettivamente modificate o eliminate. Se vale 0. ovviamente significa che il record è stato nel frattempo modificato o eliminato da qualcun altro.

Ad esempio, per l'update il comando diventerebbe il seguente (tutto in una stringa):

----------------
UPDATE varieta SET descrizione = ?descrizione,
gruppo_merceologico = ?gruppo_merceologico
WHERE codice = ?codice AND timestamp = ?timestamp;

SELECT ROW_COUNT();
----------------

Inoltre hai bisogno di leggere da VB il valore ritornato dalla SELECT, per cui al posto dell'ExecuteNonQuery, ti occorrerà un ExecuteDataset...

Infine ti faccio notare che il Timestamp va aggiornato in caso di update, altrimenti come potrebbe funzionare tutto il meccanismo?

MyCommand.Parameters(3).Value = Date.Now() 'e non Session("Timestamp")!

2) Strada più complessa, ma applicabile da MySql 4+:

si tratta di implementare le transazioni ma anche di fare parecchie modifiche all'impostazione del codice VB che hai... direi di tentare di lasciar perdere questa strada...

HTH. -LV

mgianluca Profilo | Junior Member

grazie milleeeeeee
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