Alberto75 ha scritto:
vorrei sapere come posso fare per allocare in modo esclusivo un record su DB SQL .
Mi pare tutto fuorché una buona idea, soprattutto con i database di tipo SQL.
Alberto75 ha scritto:
Dal momento in cui eseguo la lettura al momento in cui eseguo l'update del record il record stesso dovrebbe essere il sola lettura per gli altri utenti altrimenti potrei rischiare di avere dati incongruenti.
Mi viene spesso chiesta da clienti e tento di scoraggiare in qualsiasi modo questo approccio, spesso senza successo, poiché limita inutilmente l'operatività a fronte di un problema che è solo di comunicazione nella maggior parte delle volte.
Tra l'altro, molti framework ORM sono in grado di sopperire a questa mancanza, andando ad aggiornare solo i campi modificati e conservando quindi di fatto le modifiche apportate da più utenti, a meno che non siano tutte riferite allo stesso campo, condizione che appunto evidenzia un problema di comunicazione e di organizzazione, e non un problema software.
Alberto75 ha scritto:
Ho fatto alcune prove in update ed ho notato che una volta eseguito i comando "ExecuteNonQuery" il record è bloccato fino a quando non eseguo la commit ma non mi sembra la strada giusta da seguire.
Questo è esattamente ciò a cui mi riferivo sopra: le problematiche di gestione di questo approccio a livello software introducono potenziali colli di bottiglia e rischi di "deadlock" pressoché inutili, limitando di fatto il beneficio di avere a disposizione un server SQL e rendendo il software assolutamente non-scalabile.
Alberto75 ha scritto:
Come posso fare?
L'unica soluzione efficace che ho trovato nell'ambito della realizzazione di un'applicazione Web dove il cliente non ha voluto sentire ragioni è quella di aggiornare periodicamente il record (es. ogni 10 secondi) che l'utente sta modificando a video, inserendo in un campo apposito la data/ora in cui si è verificato questo "ping" di segnalazione di modifica.
Le altre postazioni leggono il record assieme a questo campo e, se vedono che dalla data/ora di modifica inserita non è trascorso un certo lasso di tempo (es. 30 secondi), segnalano che il record potrebbe essere in corso di modifica da parte di un altro utente; se invece il tempo prestabilito è trascorso, non viene fatta alcuna segnalazione.
A fronte di dover aggiornare periodicamente il campo del record, soluzione che reputo assolutamente inefficiente, si ottiene il vantaggio di poter segnalare l'eventuale modifica da parte di un altro utente, ed eventualmente anche di chi (se si include il dato nei campi memorizzato), e nel caso in cui l'applicazione vada in crash o smetta di aggiornare il record, questo diventa automaticamente "libero" dopo pochi secondi, senza che sia necessario un intervento amministrativo o che si debba ricordare di aggiornare di nuovo il record quando le modifiche sono terminate.
La soluzione funziona senza problemi, ma non sono felice di averla implementata, poiché sono ben conscio delle limitazioni che ha.
Ciao!