Newsgroup: it.comp.software.database
Titolo: Bloccaggio utenti in DB SQL

Ciao,
Ho questo problema : ho un db SQL al quale un certo numero di utenti si
interfacciano tramite una applicazione in VB5. L'applicazione permette di
modificare campi ed inserirne di nuovi, di avere elenchi e report.
Ogni tanto succede che, sebbene due o più utenti non accedano allo stesso
record, si abbiano dei blocchi che rallentano tutti e che non permettano ad
un utente di salvare modifiche di un record.
L'applicativo usa naturalmente una connessione ODBC , l'accesso alle tabelle
non avviene tramite ODBCDirect ma uso il blocco ottimistico dei record
durante l'aggiornamento.
Che tipo di problema potrebbe essere?
Grazie per le informazioni

 Che tipo di problema potrebbe essere?
Devo supporre che per DB SQL tu intenda Microsoft SQL Server
(SQL sta' per Structured Query Language, non e' un'acronimo per
Microsoft SQL Server).
Credo che il tuo problema sia proprio il "blocco ottimistico" ed il
meccanismo insito in Microsoft SQL Server per l'accesso ai dati. 
MS usa un meccanismo di "lock per leggere", in sostanza se stai leggendo
(Select) una tabella, la stessa viene bloccata, percui chiunque stia
cercando di Scrivere (Update/Insert) viene fermato finche' il processo 
di lettura non ha completato la sua lettura.
Se usi delle query particolarmente complesse o tieni dei cursori
attivi sulle tabelle il lock viene mantenuto.
Inoltre Ms usa un lock "di pagina" e non di record, quindi un singolo
lock non agisce su un solo record, ma su piu' record (il numero e'
variabile a seconda della dimensione della pagina).
Quello che posso suggerirti e' di rivedere il tuo sistema di accesso,
ottimizzare le query in modo che agiscano il piu' in fretta possibile,
utilizzare le transazioni per gli aggiornamenti e spostare ove
possibile la logica di funzionamento all'interno del database con
Stored Procedure, Trigger et similia.
Davide

Innanzi tutto grazie per la cortesia dimostrata.
Il programma che mi da quei problemi effettivamente accede a Microsoft SQL
Server.
Le query che faccio sono abbastanza complesse e si appoggiano anche a viste
create all'interno del DB. Dopo ogni query e operazioni su di insert/update
ho messo un comando ("DBEngine.Idle dbFreeLocks") sperando che mi rilasci i
record bloccati : pensi possa servire?
Meglio impostare nelle query il blocco ottimistico che quello pessimistico,
vero?
Ciao e grazie


 pessimistico, vero?
Il lock ottimistico "ipotizza" che tu (o meglio, il database) riuscirai
a fare il lock nel momento in cui servra', quindi ritarda al massimo
l'effettuazione del lock, quello pessimistico invece tenta il lock
immediatamente e lo rilascia dopo l'aggiornamento, quindi in condizioni
di grosso carico il lock ottimistico ha piu' possibilita' di fallire di
quello pessimistico. In entrambi i casi devi gestirti la possibilita'
che il lock (e l'aggiornamento) falliscano. Quale dei due sia migliore
dipende dalla tua applicazione e dal numero di utenti che la usano. In
molti casi quello ottimistico e' piu' che sufficiente.
Davide

 ha scritto nel messaggio
news:9fna38$4ujq5$1...@ID-18487.news.dfncis.de...


 forzarglielo in qualche modo?
Quando chiudi il recordset il lock viene rilasciato, non c'e' niente
di particolare da fare, ovviamente questo viene fatto dal DB, quindi
non e' istantaneo ma richiede il suo tempo... diciamo da qualche 
millisecondo a qualche secondo a seconda del numero di "pagine" e
della potenza del server.
Davide