Newsgroup: it.comp.lang.visual-basic
Titolo: Accessi simultanei a database Access

Ciao a tutti, come da oggetto, ho un problema con l'accesso simultaneo
ad un database Access da parte di due postazioni che eseguono lo
stesso programma.
In dettaglio, l'applicazione elabora un bilancio e, leggendo dalla
tabella delle operazioni contabili, scrive i record con i dati
necessari alla stampa in una tabella d'appoggio, con l'indicazione su
ogni record dell'utente che ha lanciato l'elaborazione (parliamo di
10-15 mila record a testa per una elaborazione di 1 minuto circa).
Quando due utenti lanciano l'elaborazione, può capitare che ci sia un
periodo di concomitanza di scritture nella tabella; alcune volte
capita che una delle due postazioni riceve un messaggio che indica che
la tabella è bloccata dall'altro utente.
La cosa strana è che ho provato a creare a runtime due tabelle
distinte, una per utente, in modo che gli utenti non si trovino a
scrivere nella stessa tabella, ma mi da lo stesso errore!
In pratica l'utente A scrive nella tabella A, l'utente B scrive nella
tabella B, ma all'utente B viene segnalato che la tabella B è bloccata
dall'utente A!
E' come se l'intero database rimanesse bloccato ogni tanto per qualche
istante e se in questo periodo il secondo utente vuole scrivere nella
sua tabella riceve l'errore. Nell'elaborazione singola infatti
l'avanzamento è regolare, mentre in quella con due utenti i singoli
avanzamenti fanno delle pause di 2-3 secondi per poi ripartire.
Qualche informazione sul programma:
ambiente VB6
connessione ODBC (ma ho provato anche OLEDB)
database Access 2000
pc Windows XP
Se servono altre informazioni sono a disposizione
Grazie per l'attenzione
Massimo

 ad un database Access 
Alt: "Accesso Simultaneo" e "database Access" non possono convivere
nella stessa frase senza una negazione.
Il db crea un lock quando viene aperto, tale per cui non � accessibile
da altre postazioni.
La soluzione � quella di passare a db pi� orientati alla multi utenza
come SQL Server (2005/2008) o, nel caso tu voglia lavorare su file
singolo, passare a SQL Server Compact edition o l'ottimo (e leggero!)
SQLite.
Nicola

 da altre postazioni.
Grazie per la risposta, ma il nostro programma gira da anni su access
in multiutenza con un unico database...
Il lock di cui parli serve ad impedire rinomina e cancellazione del
file, ma non l'accesso ai dati.
Il problema sembra sorgere solo nel caso di elaborazioni molto pesanti
di scrittura contemporanee (infatti fino ad ora non ci era mai
successo).
La mia impressione è che la connessione tra vb e access non memorizzi
i record singolarmente, ma memorizzi i record in un buffer da
trasferire periodicamente al database. Di conseguenza la scrittura dei
record provoca un blocco del database di qualche secondo.
Ma questa è solo una teoria....
Massimo

 da altre postazioni.
access con ado pu� creare *vari tipi* di lock.
un mio mdb su un server sta girando con 5 accessi contemporanei da un 
abbastanza bel po'. mai crollato.
lupo, se ricordo, di accessi cont ne aveva una quarantina senza particolari 
problemi.
che ci sia di meglio non discuto.
ma se dai informazioni, p.f., dalle corrette.
oppure candidati anche tu :PPP
ciao 

 particolari problemi.
Mah, io avevo capito che entrambi gli utenti dovevano lanciare la stessa
elaborazione sulla stessa tabella. Quindi, correttamente, andavano a
rompersi le scatole a vicenda sui vari record. O capito male?
Nicola


Scusami eh...sarà il caldo ma stasera non mi riesce restare "neutro"!
Se sono "anni" che gira multi utente....come mai proprio "ora" noti
una cosa del genere?
Forse perchè l'hai sempre venduto mono utente?
Forse perchè l'hanno sempre USATO mono utente?
Usi ODBC hai detto.....e che strategia di accesso multi utente?
API odbc?
DAO?
RDO?
ADO?
ossia...il programma come fà a gestire i conflitti?
Spera in Dio?
E' abbastanza normale che se io sto scrivendo un record...un altra
scrittura vada in conflitto! Una lettura no...dipende dalla tecnologia
(ossia dal cursore usato...un cursore dinamico aspetta...un altro tipo
no! a costo di leggere dati errati!....è per questo che ci sarebbero
trigger semafori e amenità varie in db più "seri")
Inoltre...access è un database COMODO perchè sta in un file
soltanto...ma non puoi chiedere ad una 500 di correre contro una F1!!!
Io ho fatto tanti programmi con access....per piccole imprese....va
benissimo!
Se i posti di lavoro salgono...ah beh...anche le esisgenze salgono
UNA SU TUTTE
se si baca il file mdb?
ti tocca implementare un sistema di backup nel tuo programma...
db seri hanno lo strumento di backup incorporato....
E se vuoi tornare indietro ad alcune transazioni?(Una scrittura
contabile ad esempio)...diventa complicato in access..etc etc
Se uno fa un gestionale prima o poi ci si schianta contro queste
cose!...certo se uno lo fà pagare 80 Euro....non ci possiamo aspettare
tante finezze!
Inoltre nello specifico....
il problema lo hai prchè hai MOLTI records da passare
il driver ODBC comincia a raccogliere i dati della query...e te ne
passa "un pò"....quando ti sposti e ne chiedi ancora "te ne serve un
altro pò"...e così via fino alla fine....
Però quei record per una frazione di tempo sono bloccati...e se il
driver odbc è fermo ad aspettare le tue richieste....
Quei record sono bloccati per altre richieste e falliscono....
Ecco perchè vedi andare a singhiozzo!
Query piccole non ti darebbero questo problema!
Il consiglio di Nicola non era assolutamente campato in aria!
Passa ad un db più "serio"....il tuo lavoro ne acquisterà in
prestazioni e manutenibilità!!!
E butta via ODBC!

 successo).
E'quello che dicevo. Mi pare di capire che gli utenti possano lanciare
la stessa elaborazione che impatta sulla stessa tabella. Quindi vanno in
conflitto sui vari record. O ho capito male?
Nicola

 Massimo
So che ogni tanto bisogna fare s� che il Jet Engine "rinfreschi" i locks, 
specie se gli accessi alle tabelle avvengono all'interno di cicli 
computazionali piuttosto pesanti.
Quindi, se usi ADO, invocando JRO.RefreshCache:
http://msdn.microsoft.com/en-us/library/bb237216.aspx
Se usi DAO, mi pare sia DBEngine.Idle:
http://msdn.microsoft.com/en-us/library/bb221047.aspx
Bye
Raf 

la cosa mi interessa, e se usi ADO.Net ?


Non mi aspettavo di scatenare un pandemonio del genere!
x Wodka40: tu sei il motivo per cui non scrivo mai nei newsgroup ma mi
limito a leggere per imparare: perchè dovrei fare una semplice (mica
tanto in realtà) domanda per avere una risposta che io considero
offensiva (anche se magari dirai che scherzavi)?
Visto che non conosci nulla del nostro applicativo, che bisogno c'era
di lanciarti in certe affermazioni?
So benissimo che se usassi un database più seri avrei sicuramente
prestazioni migliori e maggiore sicurezza, ma purtroppo non abbiamo
ancora nè i mezzi, nè la struttura per migrare il gestionale. Per il
nostro target di clientela access va più che bene e ci è capitato solo
ora semplicemente perchè, nelle installazioni attuali, è raro (leggasi
non è mai successo) che due postazioni lancino contemporaneamente due
elaborazioni pesanti contemporaneamente. E' capitato una volta e mi è
venuto lo scrupolo di risolvere il problema prima che si ripresenti e
per capire un po' di più dell'accesso ai dati.
Sono 10 anni che programmo in vb e non ho mai fatto un corso:
fortunatamente per lavorare non è sempre necessario essere certificati
o super specializzati; ci si accontenta di risolvere i problemi
quotidiani e portare a casa la pagnotta! Sicuramente i miei programmi
non sono perfetti, ma fanno il loro lavoro e i clienti sono contenti,
questo per me è sufficiente.
Per la cronaca, ho risolto il problema utilizzando il cursore statico
e utilizzando un recordset per eseguire i comandi sql (INSERT e
DELETE) invece del metodo Execute della connessione.
Grazie a tutti
Massimo


ehm ehm ehm
in 
ado.net
 sei SEMPRE disconnesso
pensala sempre come un cursore static (se proprio non riesci a fare a
meno dei cursori)


Ascolta nanni....se mi provochi mo scoppia il flame!
Perchè uno ha un impiegato o due....gli fai un programma di merda???
E all'industria con 10 impiegati uno con i controcazzi????
Ma che cavolo di professionalità è?????
Io ti consiglio di usare uno standard e di adottare sempre quello!
Ne guadagli in manutenzione, malox e tempo....tutte cose che si
traducono in soldi! Mica balle!
Le skill ne convengo servono a poco se dietro non c'è la testa!
Però la testa anche se non "qualificata" ci deve sempre essere!
Tanto per dire....
se tu passi per connection.execute....vai a vederti le discussioni e
le faq di 3 4 5 anni fà......
connection.execute funziona lato server...con i pro ed i contro....
se ora mi risolvi con un cursore statico ed un recordset...c'era da
chiedersi che cosa usavi prima (se usavi una connessione impostata
lato server i cursori molto probabilmente erano dinamici ed allora era
NORMALE e CORRETTO che si bloccassero...anche se ti mangiano risorse
in modo spaventoso!)...se sai la differenza fra client e server...(che
meno male dotNet ha sistemato una volta per tutte)...etc etc
e la differenza fra update e batchupdate.....
il fatto che tu programmi per portarti a casa la pagnotta non ti
esimerebbe da essere professionale e fornire un prodotto che rispecchi
una funzionalità ragionevolmente esente da bachi!
Ossia tradotto....debug continuo....finchè il prodotto non è
stabile....e se è anni che lo vendi e te ne accorgi solo ora...ma che
cazzo di debug hai fatto??? Non è per sindacare...è capitato anche a
me...un prodotto fatto con i piedi e controvoglia...fatti debuggare
sul campo dal cliente in puro stile microsoft! (eheheheh)
In quanto all'investimento.....
se vuoi rimanere in VB6
ADO + Sqlexpress....GRATIS
ADO + MySQL.....gratis
multi utenza vera....lock come vuoi tu...stored procedure...e tanto
altro
Ora ti ho punto nel vivo......
non mi scuso...ne ho scherzato.....
se sei intelligente....e lugimirante.....una volta sbollita la rabbia
e dopo avermi mandato a fanculo....rileggi quello che ti ho detto e
parti da li per migliorare la tua applicazione e la tua cultura
informatica.....
Saluti....
p.s.
Non sei mica il figlio del lattaio vero???
;o)

 rompersi le scatole a vicenda sui vari record. O capito male?
A quanto ho capito io questa era la situazione originale: una tabella temporanea 
contenente i dati per la stampa, e due utenti che tentano di scriverci una marea 
di record.
Mi pare, per�, che nel post originale Spillo dica di aver provato a creare 2 
tabelle distinte, quindi la domanda che faceva lui era: 'come mai due utenti che 
agiscono su tabelle differenti ricevono un messaggio di tabella in stato di lock'?
A meno che non sia stato io a capire male.
E comunque confermo, anche qui a Vicenza Access si fa usare da pi� d'un 
utentesso al colpo ;)
-- 
S.

Ringrazio Stevie per l'appoggio (il problema era esattamente quello)
mentre a Wodka40 un fanculo lo risparmio perchè sono educato (il tuo
post non lo rileggo perchè con i maleducati non ci parlo).
Grazie ancora a tutti per l'attenzione.


Peccato..perchè in mezzo ci avresti trovato informazioni che si
sarebbe tramutate in denaro!
Contento te....ciao bello!

 ha scritto nel messaggio 
news:dac62f1a-eda6-4494...@c2g2000yqi.googlegroups.com...


 ha scritto nel messaggio 
news:442cce5e-ef83-418a...@d32g2000yqh.googlegroups.com...
Ringrazio Stevie per l'appoggio (il problema era esattamente quello)
mentre a Wodka40 un fanculo lo risparmio perch� sono educato (il tuo
post non lo rileggo perch� con i maleducati non ci parlo).


 e diretto ma sicuramente esperto in programmazione.
Il problema è che risponde *sempre* così, e tipicamente, insieme ai
consigli, infila dentro apprezzamenti e "consigli di vita" non sempre
richiesti/pertinenti.
Leggendolo da anni, uno lo sa, riconosce il suo classico stile "stream
of consciousness", e non ci si bada troppo, ma lui appena arrivato si
trova davanti una risposta così, giustamente un po' si incazza...

 trova davanti una risposta così, giustamente un po' si incazza...
Se ti incazzi sono cazzi tuoi!
Ho 46 anni e sono esperto di alcune cose della vita...non di tutte per
carità!
Nel mondo reale , qui da me, NON TROVI il freddo algido lombardo che
ti risponde alla norvegese dandoti la SOLA essenziale informazione e
lasciandoti spaesato e alla fine ignorante quanto prima!
Trovi gente che "ti svernicia" alla prima mancanza....
ti dirò che VA BENE così!
Se io sto nel mio guscio (e quanto è facile con internet crearselo a
propria imagine e somiglianza) tendo ad avere una percezione distorta
della realtà!
Contemporaneamente....chiamami hippy, fricchettone, ragazzo del
63....come vuoi...io ho una ALTA concezione della community!
Qui si discute non per fare help desk....ma per migliorare il nostro
lavoro collettivo....
ovvio utopia...ma almeno bisogna provarci!
IO mi faccio mille interrogativi....sono sempre in discussione con me
stesso...sempre alla ricerca di nuovo e conoscenza....così mi
elevo...cresco culturalmente e socialmente....
ed internet è un mezzo uno dei tanti!
MI INCAZZO ALLA MORTE...quando vedo colleghi ripiegati su stesi nel
loro mondo di merda che inevitabilmente contamina anche il mio...e
probabilmente anche il vostro....
Esempio
Se una azienda mi commissiona un lavoro....faccio tutti i passaggi
tipici e rimetto il prezzo.
ad es. 800
COSTANTEMENTE
sono scavalcato da "colleghi del cazzo" che fanno programmi bacati per
500 (l'ordine di grandezza è supergiù quello...25/35% in meno)
Questi qui fanno un analisi buona ed una implementazione alla cazzo di
cane (se paghi uno junior a forfait 600 Euro il mese che vuoi di
più???)
MA SICCOME siamo in tempi di crisi....il manager acquista il programma
bacato...e se ne fotte degli impiegati!
Notare che questo è vieppiù più vero nel pubblico dove le aste/gare al
ribasso provocano la sabbia nei viadotti e programmi informatici
inusabili...e ho esperienza diretta di quanto affermo
Penso che sia MIO dovere bacchettare chi programma con i piedi e che
si accorge solo dopo anni che l'applicazione ha pesanti limitazioni!
Purtroppo gli informatici sono miopi...non hanno voluto un albo che
vincolasse a requisiti ed ad un tariffario minimo...ergo...tutti sono
informatici e inquinare il mercato solo sapendo mettere 2 data control
in croce su un form!
Inutili le balle che la qualità alla lunga paga:
un manger pubblico/privato è vincolato al bilancio e spesso
all'assemblea dei soci non ha soldi e deve (DEVE) trovare economie
dappertutto!
Mi sto defilando sempre più...e penso di mettere su un ristorante
etnico "Dal Wodkino incazzato"
ecco la ragione del perchè ogni tanto parto per la tangente....
stò facendo un favore a chi riceve la mia "lavata di capo"....qualcuno
dopo un po lo appezza e mi dice grazie (pochissimi)...altri apprezzao
e no ringraziano (ingrati)......pochi si offendono e non capiscono
quello che dico (sono i figli del lattaio che hanno messo su una ditt
di informatica)
...e con questo....ho ridetto per l'enesima volta perchè sono un
toscanaccio!!!
Ovvia!

 post non lo rileggo perch� con i maleducati non ci parlo).
Proprio uno Spillo si deve incavolare perch� viene punto ? ;-P
Fidati: "quelli" non sono punzecchiamenti, sono consigli, e tu
non sai quanto valgono. Il miglior augurio che ti posso fare
� di arrivare a capirlo.
Bye, G.

 oppure candidati anche tu :PPP
Io voto lui:
http://i27.tinypic.com/2ujnibp.jpg
Bye, G.

 post non lo rileggo perch� con i maleducati non ci parlo).
Mann�.
E' che Wodka ha un modo di scrivere che a volte (no: spesso. Non te la prendere, 
Wo'!) pu� suonare molto irritante.
Solo che probabilmente frequenti poco questo NG (o sei proprio nuovo) e non lo sai.
Non sto difendendo nessuno eh, nemmeno a me piace il tono. Per� cerca di 
cogliere quanto di buono c'� nei post di ognuno, a prescindere dal tono.
Rovinarsi il fegato per 'ste minchiate non ha senso.
-- 
S.

 ADO + MySQL.....gratis
mhhh ... sei sicuro?
Mi risulta che sia gratis se tu rialasci il tuo programma sotto licenza 
GPL, oppure se non devi distribuire la tua applicazione (ad esempio un 
servizio, o sito, web che gira sui tuoi server) ma se fai 
un'applicazione commerciale closed source credo che la licenza si debba 
pagare.
Oh, poi magari mi sbaglio, non son andato ad approfondire, sono 
reminescenze.
ciao
stefano

Stefano Ferrari ha scritto:

Confermo. E' gratis solo per programmi liberi.
Gli unici utilizzabili gratuitamente anche per scopi commerciali sono MS
SQL Server Express e Firebird.
Ovviamente mi riferisco a dbms client-server
Per dbms a singolo file ci sono i SQL Server Compact Edition e l'ottimo
SQLite
Nicola

Jet 4.0 (aka il motore DB di default usato da Access) fa il lock di pagina 
(4096 bytes). Se in una pagina ci stanno pi� record ed un record � lockato 
tutti i record di quella pagina sono lockati.
Chiaro?

 Chiaro?
Ecco la risposta che volevo!
E a questo punto una curiosità: la pagina è unica per il database
(quindi contiene i record di tutti gli utenti connessi) o ogni utente
ha la sua?
Se non hai voglia non rispondermi, mi andrò a cercare la
documentazione quando rientro in ufficio (a quest'ora non mi va di
cercare); se invece hai la risposta pronta sono tutto orecchi!
Grazie

 ha la sua?
Visto che il database contiene *UN* set di dati, il lock è relativo a
tutto il DB (lock "per utente" che senso avrebbe? esiste apposta per
evitare scritture concorrenti in conflitto...)

 di informatica)
Qui concordo 100% (forse perche non c'entra il pubblico)
Un pubblico grazie a te, ad Albe, ad hal961, a Lupo....e mi scuso con chi 
dimentico, ma mi avete dato tanto, soprattutto con le icnazzature o le 
mancate risposte.
-- 
Greg