Newsgroup: it.comp.software.database
Titolo: Blocco di singola riga

Ciao, per fare il blocco di una singola riga di una tabella, l'unica è
gestirlo con un campo apposito on/off?
Serve chiaramente a fare in modo che se un utente carica un record e lo sta
comodamente editando nella sua mascherina, altri non lo modifichini nel
frattempo. Ovviamente sarà il programma a gestire e far rispettare i
blocchi.
Il problema è che ogni accesso si trasforma in una lettura -> controllo se
già bloccato -> eventuale scrittura per il blocco.
Altre soluzioni?
Ciao, Stefano.

 Ovviamente sarà il programma a gestire e far rispettare i blocchi.
Questo si chiama accesso concorrente. Ogni database decente dovrebbe
gestirsi i lock e gli accessi concorrenti per conto suo, senza
problemi per il programmatore e senza obbligarlo a fare "salti
mortali". Le soluzioni sono diverse: 
1. usare "SELECT ... FOR UPDATE" che effettua un lock del(i) record
   in modo da poterli poi aggiornare senza problemi
2. avere un timeout "rapido", cosi' che l'utente non ci possa mettere
   due ore a fare le sue modifiche, ed inviare un UPDATE del
   record rapidamente (meno tempo aspetti meno possibilita' che
   due utenti si mettano a modificare lo stesso record)
3. bloccare l'intera tabella per la durata della modifica (brr...)
Ovviamente cosa usare dipende da vari fattori, tra i quali:
1. quanti utenti contemporanei hai
2. quante sono le possibilita' che due utenti si mettano in testa di
   modificare lo stesso record nello stesso momento
3. come il database si gestisce i lock.
Per quanto riguarda quest'ultimo punto, tieni conto che ci sono due
"scuole" di pensiero. La scuola "Microsoft" e la scuola "IBM". Nel
primo caso, quando tu fai una SELECT (una normale SELECT), il database
acquisisce un READ-LOCK sui record, questo impedisce a qualunque altro
utente di accedere in modifica agli stessi record fintanto che tu non
hai cessato di leggerli, nella scuola IBM invece, il database
richiede un WRITE-LOCK quando invii una UPDATE, se un altro utente
cerca di leggere il record, il database usa la copia nel log delle
transazioni per ricostruire il valore precedente del record, quindi
l'utente "B" vede il record "vecchio". Ovviamente solo un utente 
alla volta puo' accedere in SCRITTURA al record.
Davide
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG


Dipende dal db utilizzato, in Access il lock è possibile solo a livello di
pagina, quando imposti un lock vengono bloccati tutti i record che
appartengono alla pagina in cui risiede il record che stai editando (una
pagina è grande 2K)
In sql server il lock può essere effettuato a livello di singola riga.
Con altri rdbms non so.
Altre soluzioni (leggi campo on/off) sono quanto meno "pericolose";
Impostare un timeout rapido può non essere possibile, faccio un esempio, se
il tuo programma si occupa di catalogazione, i tempi di editazione possono
essere anche piuttosto lunghi.
Dipende, in sostanza, dall'applicazione che sviluppi.
Ciao
Ste

 3. bloccare l'intera tabella per la durata della modifica (brr...)
Questa proprio no :-)
Considera che l'applicazione è via web, per quel che conta, e non posso dire
ad un utente: fai la modifica in cinque minuti o ti spacco in due.
Comunque, dopo aver scritto il messaggio ho trovato un articolo su come
interfacciare un modello ad oggetti su un DB relazionale. C'erano due righe
anche per il mio problema. La prima soluzione era proprio quella di segnare
il record (in un campo apposito) e gestire la logica dell'accesso a livello
di applicazione. Il problema è che, essendo via web, è difficile avere il
controllo dell'utente e se questo mi chiude il browser dopo avermi bloccato
un record, sono fregato.
In alternativa, diceva l'articolo, se le probabilità di accesso
contemporaneo sono basse, si può usare un timestamp ad ogni scrittura.
Quindi quando vado a fare l'aggiornamento posso controllare se quel record è
stato "toccato" da qualcun altro e avvisare l'utente. Via web è un po'
macchinoso ma probabilmente si può fare...
Grazie per l'ampia panoramica, Stefano.

 Considera che l'applicazione è via web, per quel che conta, e non
Nota: se sei su Web, in genere dopo un certo tempo la sessione decade,
quindi se hai una connessione al database aperta questa viene chiusa.
