Accesso esclusivo

martedì 24 gennaio 2006 - 16.50

lordwaizard Profilo | Senior Member

Ho più client che visionano la stessa tabella.
Il programma dovrebbe selezionare la prima riga disponibile e assegnarla all'operatore che la richiede impostando la voce denominata UTENTE(NVARCHAR) il nome dell'utente.
Ora la mia preoccupazioni è quella che nel tempo della modifica, un'altro client esegua la stessa operazione aggiornando la medesima riga.
Il mio obbiettivo è quello di far in modo che ogni riga debba essere assegnata esclusivamente a un utente.
E' possibile?

Scusate per la domanda da principiante.
Grazie
Davide

Cteniza Profilo | Guru

Se usi msde o sql server hai il tipo rowversion (ex timestamp) che se utilizzato opportunamente ti indica se la riga che stai modificando / cancellando è la stessa che hai letto.
Su ado.net la gestione dei dati è disconnessa e vige la regola che chi arriva per primo per primo fa gli aggiornamenti.


Giamp72 Profilo | Junior Member

se usi mySql potresti utilizzare le istruzioni lock e unlock.

sql per il lock
Lock Tables nomeTab WRITE

sql per unlock
UnLock Tables

Io ho risolto un problema analogo al tuo in questo modo:
il primo che arriva esegue il lock sulla tabella da aggiornare, fa i suoi ragionamenti e poi aggiorna il campo.
In questo lasso di tempo, se qualche altra query viene fatta su questa tabella, viene messa in coda...
quando la prima stazione esegue l'unlock, le altre stazioni che erano in coda vengono sbloccate..


Giamp72

Cteniza Profilo | Guru

Non si tratta della stessa cosa!.
Su mysql con quelle istruzioni l'ultimo che arriva esegue l'aggiornamento.
Su sql server/msde ogni volta che fai un aggiornamento il valore del campo timestamp/rowversion viene cambiato e solo il primo che arriva esegue l'aggiornamento, quelli che arrivano dopo si beccano un bel errore.


lordwaizard Profilo | Senior Member

In alternativa non si può fare una unica query che legga e aggiorni in automatico riducendo così il processo

In questo momento la risolvevo così:
LEGGO
il programma rileva l'ID e invia
UPDATE

Non è possibile creare una query che esegua:
La prima riga libera (E SOLO QUELLA) aggiorna le seguenti celle

Dite che sia possibile?

Cordiali saluti
3S/Davide Fiorani

NB
Db utilizzato MSDE/MSSQL

Cteniza Profilo | Guru

Nella tua situazione se ci sono due postazioni diverse che inviano degli aggiornamenti entrambe riescono nell'impresa.
Questo perchè la tua struttura non tiene conto del rowversion.
Secondo me dovresti trasformare la tua query in:
UPDATE mytable SET campo = valore WHERE ID = myid AND [timestamp] = mytimestamp
(stessa cosa per delete)
In questo modo solo il primo che arriva ha il valore di timestamp corretto, ad ogni aggiornamento msde aggiorna il valore del campo timestamp un successivo aggiornamento con il medesimo timestamp non avrebbe luogo.

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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5