Newsgroup: it.comp.lang.delphi
Titolo: Gestione accessi concorrenti al database

Ciao a tutti.
Vorrei qualche consiglio sulla politica da adottare per gestire gli accessi 
concorrenti di piu' utenti allo stesso database nell'ambito di un'applicazione 
di tipo client-server. Il tutto, possibilmente, senza doversi necessariamente 
legare ad uno specifico database.
Delphi 7 offre qualche strumento particolare per risolvere questa problematica?
In quest'ottica e' meglio ADO o DBExpress?
Conoscete tool o librerie di terze parti per Delphi che aiutino a gestire il 
tutto magari con dei lock sui record che siano di tipo logico (ovvero che 
tengano traccia degli accessi senza loccare fisicamente i record ed 
eventualmente bloccandoli prima che venga inoltrata l'effettiva richiesta al db) 
anziche' fisico? Un sistema basato sui lock logici lo preferirei perche', per 
esempio, immagino che potrebbe fornirmi anche il nome dell'utente (inteso come 
utente registrato nella mia applicazione e che quindi non ha niente a che vedere 
con l'account utilizzato per loggarsi al db) che blocca un certo record e non 
solo un generico messaggio di errore in seguito ad un nuovo tentativo di 
scrittura sullo stesso record.
Grazie per l'attenzione
Andrea Barbagallo

tutto magari con dei lock sui record che siano di tipo logico 
In una logica client/server, non si "locka" alcunché né in modo
logico, né in modo fisico, ma ci si affida al gestore delle
transazioni del RDBMS utilizzato.

 transazioni del RDBMS utilizzato.
Quindi, appena l'utente inizia a scrivere sui campi di una form apro la 
transazione e la chiudo solo in seguito alla pressione del tasto "salva", dopo 
che tutte le query necessarie per salvare i dati sono state eseguite; stessa 
cosa per l'eliminazione di un record: appena si preme il pulsante "elimina" apro 
una transazione, eseguo la query "delete from..." e chiudo la transazione; in 
caso qualcosa vada storto o l'utente chiuda la finestra senza salvare, faccio un 
bel rollback. E questo l'approccio corretto, ovvero usare le transazioni solo in 
occasione di modifiche dei dati da parte dell'utente? Oppure dovrei aprire una 
nuova transazione sistematicamente gia' nel momento in cui l'utente apre la form 
in visualizzazione di un certo record (cioe' senza dover attendere l'avvio di un 
tentativo di modifica da parte dell'utente)? E nel caso dell'inserimento di 
nuovi record come mi comporto?


occasione di modifiche dei dati da parte dell'utente?
Le transazioni si usano, in generale, per isolare le operazioni tra
utenti e mantenere la consistenza dei dati.  Non esiste un "approccio
corretto" in generale, bisogna capire che cosa vuoi fare esattametne.
Anche perché di livelli di isolamento tra le transazioni, ce ne sono
diversi e bisogna scegliere quello adatto (che in molti casi è il
default "read committed").  Quando e come gestire le transazioni
dipende dal DBMS che usi e dai componenti di accesso ai dati.  Per
esempio, se usi la tecnologia MIDAS, molte operazioni relative al
controllo di accesso agli stessi dati, da parte di più utenti, vengono
gestite automaticamente.  La dipendenza dal DB può influenza il
"quando" una transazione viene attivata (alcuni DB gestiscono anche le
select in una transazione apposita, altri no).