Moderatori: Dylan666, hydra, gahan
Immagino che tu ti riferisca alla possibilità di modifica di uno o più campi della stessa riga da parte di due o più utenti contemporaneamente.
Non so come funziona il metodo “sinchronized” di java, ma l'idea di "serializzare" l'accesso ad una risorsa (db, tabella o singola riga che sia) impedendone l'accesso contemporaneo a diversi utenti mi terrorizza.
In ambito web (non client-server, quindi) credo che l'unica soluzione praticabile per evitare di perdere dati in uno scenario come quello sopra descritto sia controllare, prima di fare l'aggiornamento se i dati che sto per modificare non sono stati nel frattempo (cioè da quando li ho richiesti ad ora) cambiati da qualche altro utente. Ergo, mi porto dietro i dati "vecchi" (prima delle modifiche) insieme a quelli nuovi. A questo punto, infine, devo decidere cosa segnalare all'utente (cosa forse meno banale di quanto possa apparire di primo acchito).
Non è che siamo messi male: l'HTTP è per sua natura un protocollo stateless, per cui risulta problematico e poco efficiente, se non impossibile, mantenere i locks sulle risorse. A seconda del db (tra l'altro, di quale stiamo parlando?) e del linguaggio usato, si dovrà tener conto di ciò per evitare sorprese.Swalke ha scritto:Non so come funziona il metodo “sinchronized” di java, ma l'idea di "serializzare" l'accesso ad una risorsa (db, tabella o singola riga che sia) impedendone l'accesso contemporaneo a diversi utenti mi terrorizza.
Bhe, siamo messi male perchè tutti i software del mondo devon tutelare le "zone critiche" (porzioni del codice che accedono a variabili condivise) sia nel web che fuori dal web.
I metodi synchronized di java permettono l'accesso al loro codice solo ad un thread per volta (non mi dilungo troppo).
Tanto per fare un esempio, se io ho una form html per modificare il cognome di un dipendente:Swalke ha scritto:In ambito web (non client-server, quindi) credo che l'unica soluzione praticabile per evitare di perdere dati in uno scenario come quello sopra descritto sia controllare, prima di fare l'aggiornamento se i dati che sto per modificare non sono stati nel frattempo (cioè da quando li ho richiesti ad ora) cambiati da qualche altro utente. Ergo, mi porto dietro i dati "vecchi" (prima delle modifiche) insieme a quelli nuovi. A questo punto, infine, devo decidere cosa segnalare all'utente (cosa forse meno banale di quanto possa apparire di primo acchito).
Ti faccio subito un esempio per farti vedere che non funziona.
Due utenti danno il submit quindi ci sono due processi A e B che vogliono scrivere nella tabella:
Se i processi vengono alternati in questo modo dal server allora si perdono dei dati:
A pesca il dato che deve essere modificato (legge il vlalore x)
B pesca il dato che deve essere modificato (legge il vlalore x)
A vede che è uguale a quello letto
A lo sovrascrive
B vede che è uguale a quello letto
B lo sovrascrive
In questo modo ho perso i dati scritti da A!!! L'alternanza dei processi viene scelta dallo scheduler del server e quindi serve un modo per governarla!
Capito?
UPDATE Dipendenti SET Cognome=<nuovo cognome> WHERE Cognome=<VecchioCognome>
Swalke ha scritto:Ovvio che non serve e non riesco neanche a immaginare un motivo per cui un'applicazione mantiene un lok intento che un utente guarda la pagina.
Forse parliamo di due cose diverse: io dei problemi che ci sono nella modifica (UPDATE) di un record esistente, tu forse stai parlando dell'inserimento (INSERT) di un nuovo record. D'altra parte INSERT non supporta la clausola WHERE per cui faccio fatica a seguirti. Ancora una volta, non so cosa sia la memoria condivisa (un dato nel db, una variabile Application(), ...?) e comunque non mi pare riguardi direttamente il problema (locking sul db e concorrenza in ambito Internet/multiutente).Swalke ha scritto:x Archimede: il dbms è access... ...comunque non ci stiamo intendendo... ...credo che tu non abbia capito bene di cosa parlo... ...o forse io non mi sono spiegato bene.
Se la stringa SQL invece di essere quella che mi hai dato tu è:
INSERT INTO Dipendenti (Cognome) VALUES (<nuovo cognome>) WHERE ID = MAX ID
(...scusa se la sintassi non è corretta ma quello che conta è il succo)
...se questa stringa viene lanciata da due utenti contemporaneamente, lo scheduler del server potrebbe mandare in esecuzione i due processi di update come segue (smembramento della queri in istruzioni di basso livello ipotetiche):
A: seleziona max id (valore estratto = 5) e lo mette in memoria allocata per A
B: seleziona max id (valore estratto = 5) e lo mette in memoria allocata per B
A: scrive cognome dove id=5
B: scrive cognome dove id=5 (e sovrascrive i dati di A)
A: max_id++ (max id diventa 6) nella memoria allocata ad A
A: scrive 6 nella memoria condivisa che contiene il valore di max ID
B: max_id++ (max id resta 6) nella memoria allocata a B
B: scrive 6 nella memoria condivisa che contiene il valore di max ID
...e così perdi i dati di A che vengono sovrascritti da b.
Beccato! Questo è un altro approccio: segnare i records come locked prima delle modifiche (al momento della SELECT).
Ha il vantaggio che l'utente viene bloccato prima di fare le modifiche, però... Il problema principale è, secondo me, che si corre il rischio di passare ore a fare unlock (perchè l'utente è andato a pranzo, ha chiuso il browser, spento il PC, ecc.):This code runs when the page is first opened, it checks the value of the field Locked for this record. If the value is Yes, that indicates that this record is already being edited and will redirect the user to the locked.asp page, passing through a parameter to further identify the record.
If the value is anything other than Yes, then the call to the procedure will be made to lock this record. Once done, it will continue to display the record on screen for the user safe in the knowledge that no-one else will be able to view the record whilst they are working on it.
La parte che non mi è chiara è "automatically": come si fa ad automatizzare tale controllo (soprattutto in Access)?this is one way of a few I can think of, certainly not foolproof, you could build on this example by using the LockDate and LockTime fields to check if it is older than a certain amount of time say 10 minutes and then automatically, unlock the record.
archimede ha scritto:La parte che non mi è chiara è "automatically": come si fa ad automatizzare tale controllo (soprattutto in Access)?
you could build on this example by using the LockDate and LockTime fields to check if it is older than a certain amount of time say 10 minutes and then automatically, unlock the record.
Direi di si (a meno che non ne vuoi fare il tuo lavoro a tempo pieno): Oracle ha dei propri job che puoi periodicamente (ed automaticamente) eseguire, altri db (tipo SQLServer) immagino pure, ma Access? Devi allora farlo a livello di SO, ma qui entriamo in un ambito in cui non ho esperienza (e comunque siamo al di fuori di ASP).pjfry ha scritto:archimede ha scritto:La parte che non mi è chiara è "automatically": come si fa ad automatizzare tale controllo (soprattutto in Access)?
dovrai gestirtelo a mano con dei processi schedulati sul server immagino, no?
Ovviamente.pjfry ha scritto:ovviamente dipende sempre dai contenuti del db, potrà anche esserci qualche caso in cui funziona
Questa non l'ho capita: puoi fare un esempio?Dylan666 ha scritto:
- Codice: Seleziona tutto
you could build on this example by using the LockDate and LockTime fields to check if it is older than a certain amount of time say 10 minutes and then automatically, unlock the record.
Più che a livello di server penso a livello di script, cioè usare il campo "LockTime" per prendere il tempo su un timer di 10 minuti che poi sblocchi il record.
Intanto non si tratta di un "lock attivo" (qualsiasi cosa tu intenda con questo termine): viene fisicamente modificato il record sul db inserendo le informazioni relative all'ultima richiesta di modifica. Il nodo è proprio lo "sblocco" (cioè resettare il record togliendo tali informazioni, che bloccano gli altri utenti): chi, come e quando lo fa?Dylan666 ha scritto:Non si può sbloccare il database al massimo dopo 10 minuti dall'inizio di una nuova richiesta di accesso al record in modo da non poter far star ogni utente più di 10 minuti col lock attivo?
Consiglio su come gestire le pratiche chiuse Autore: systemcrack |
Forum: Applicazioni Office Windows Risposte: 19 |
gestire e togliere oggetti in colonna con condizione Autore: raimea |
Forum: Applicazioni Office Windows Risposte: 2 |
Gestire vari fogli in diversi file excel con un unico file Autore: freddydumper |
Forum: Applicazioni Office Windows Risposte: 1 |
WORD: come gestire numerazione progressiva? Autore: valle1975 |
Forum: Applicazioni Office Windows Risposte: 4 |
Visitano il forum: Nessuno e 33 ospiti