Newsgroup: it.comp.lang.visual-basic
Titolo: Bloccare accesso a tabella

Ciao a tutti,
vorrei sapere se è possibile bloccare l'accesso ad una tabella di un DB.
In pratica devo caricare il max di un valore (che incremento ad ogni
inserimento) e inserirlo in una tabella, ma voglio evitare che in caso di 2
processi contemporanei venga scritto lo stesso valore.
Avete qualche consiglio?
Grazie

 Avete qualche consiglio?
aprire una transazione?
-- 
Salutoni
Sergio
Per rispondere... togli il group dall'indirizzo
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio
news:Bn8Fd.148$
fs6....@twister2.libero.it

2 processi contemporanei sarà difficile.....
ci sarà sempre uno che si è servito "prima"
Soluzioni.....
) Usa cursore dinamico con lock PESSIMISTIC (miglior modo per buttare via
risorse del pc)
) Usa un UpdateBatch per controllare conflitti e poi risolvi i conflitti
eventuali
) Usa tabellina o file che indica che la tabella è in fase di modifica e
quale processoutente l'ha al momento in "uso"
tutte a cazzotto in cielo perchè la gestione di record concorrenti è un po
delicata e non si presta a veloci risposte....ti potrei dire che questo
problema si può risolvere mettendo in una tabella il valore massimo
dell'indice....chi arriva arriva leggerà sempre il numero e lo riscriverà
incrementato (il lock pessimistic dura pochissimo) prendendoselo per se.....
ma che succede se l'utente 1 si prende l'indice 120 e l'utente 2 il
121......
poi utente1 va in pausa...torna e cancella quello che sta facendo perchè ha
finito il turno...mentre utente2 ha già salvato la sua schermata?
Bisogna studiare il caso concreto....così si dice male.....e la tua
soluzione....bloccare TUTTA la tabella  è troppo draconiana!Se utente 1 me
la blocca per 10 minuti che faccio? gli altri utenti non lavorano per 10
minuti?
-- 
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 Demo classe vb.NET :
WodkaThumb 
www.villaceleste.it
  click su "spippolando e
Programmando"

 ci sarà sempre uno che si è servito "prima"
Allora mi spiego meglio.
Ho una tabella con 2 solo record che mi contiene un INTEGER (o varchar) con
un NFattura. Esempio: "81"
Il mio programma (che sta anche su più PC) legge questo numero, aggiunge 1 e
salva la tabella principale (Fatta da NOME + vari campi + NFattura).
Quindi salvo Pippo,..., 82 ed incremento la tabella NFattura @82
La mia paura è che se 2 accedono insieme leggono entrambi 81 e scrivono lo
stesso codice fattura.
In pratica dovrei fare tipo una transazione fra:
t=true
do until t
    a= Select NFattura from Fattura
    rs= select NFattura from TabellaPrincipale where NFattura=a 'Questo per
vedere se qualcuno ha memorizzato la fattura
    if rs.eof then
        t=true
    else
        'incremento NFattura della tabella Fattura @82
    endif
    rs.close
loop
adocn.execute UPDATE TabellaPrincipale SET NFattura=a
La mia paura è che in qualche raro caso, si scriva il solito NFattura,
quando magari entrambi vedono che 81 non è memorizzato, poi prima di passare
all'adocn.execute, entrambi scrivano 81.
Grazie :)

 Grazie :)
Una soluzione ....
possono leggere anche in 100 "21"...č quando lo riscrivono che devi gestire
la concorrenza.....udatebatch....e poi risolvi...
se passi via sql devi per forza usare un DB che ti consenta di fare
questo...altrimenti lasci fare ai cursori ADO
mah...
perň:
se il tuo problema č "prendere" per generare tabelle (spero di no)....non
vedo che un lock dynamic pessimistic sulla tabella indice...caso mai con un
timeout sul client
per impedire che l'utonto in pausa caffč blocchi tutta l'ufficio!
IMHO!
-- 
Il Wodkino Nazionale č a : 
www.martek.it


 questo...altrimenti lasci fare ai cursori ADO
Che tu sappia interbase ha questa cosa? (intanto mi documento)
Per i cursori ADO non so manco cosa siano ;), mi sa che è un po' complesso.
No in pratica leggo il NFattura da quella mini tabellina, e lo inserisco nel
record del paziente.
Esempio:
Arriva pippo, gli compilo la scheda (e la memorizzo tranno il NFattura che
lascio a NULL), poi vado nella gestione della fattura, leggo il MAX dalla
tabellina, e propongo Max+1 (es.82) e memorizzo la fattura.
Se mi arrivano 2 persone su 2 PC diversi, entrambi possono leggere dalla
tabellina 81, provano a vedere se esiste, se vanno CONTEMPORANEAMENTE
entrambi trovano che 81 è libero, ed entrambi fanno:
adocn.execute UPDATE TabellaPrincipale SET NFattura='81'
Questo è quello che dovrei fare :)
Grazie :D

 complesso.
No, se usi un DB con ADO..... i cursori son quelli che ti permettono di fare 
tutto, ma veramente tutto.



Mi sa che sei giovane di scuola...o stamani hai dormito male e non sei
lucido!
Fai una grande confusione di termini!
e poi....se non conosci ADO siam messi male!...molto male!prevedo lacrime e
sangue!e records doppi!
:-)
possibile soluzione te l'ha detta fabio...se identifico un record con la
chiave primaria "NumeroFattura"...dal più scacio al più performante
databaserelazionale....si incazza se li metti 2 numeri uguali!
Ma in genere una fattura avrà...una testata...le voci della fattura
Io li metto in due tabelle correlate....
e poi come detto da fabio....
PRIMA raccolgo i dati----> poi li invio al database--->risolvo i
conflitti...che consistono essenzialmente in questo....c'è già quel numero
fattura? riprova con quello +1....riprova ad Aggiornare DB-> rivisualizza
sul client i dati!(oppure segnala che tutto è ok!)
-- 
Il Wodkino Nazionale è a : 
www.martek.it


 di fare tutto, ma veramente tutto.
Ora vedo un po' cosa sono ^_^
Grazie :)


obiezione
e se un nominativo fa più fatture?
che fai ???
se una fattura ha più voci? come fai?
-- 
Il Wodkino Nazionale è a : 
www.martek.it



Che bello, il Wodkino che ..... discute con me e non ........ che bello.
BTW ma alla fine sto router lo hai completato e funziona? Lo usi ancora? 

 completato e funziona? Lo usi ancora?
che router?....????


 Il Wodkino Nazionale č a : 
www.martek.it


 e se un nominativo fa più fatture?
Per come funziona ci saranno 2 righi nella tabella principale.
Infatti non sono proprio fatture vere e proprie, in pratica sono un
riepilogo degli importi che stanno nella tabella principale.
Quindi:
ID=1 Nome=Pippo Importo1=10.00 Importo2=9.55 Importo3=3.44 NFATT=82
Se ci sono 2 fatture ci sarà:
ID=2 Nome=Pippo Importo1=3.66 Importo2=4.85 Importo3=0.00 NFATT=83
Poi con ID=1 c'è un'altra tabella che riporta un elenco di prestazioni
quindi:
IDTabPrinc=1 IDPrest=55
IDTabPrinc=1 IDPrest=47
IDTabPrinc=2 IDPrest=23


con sapiente impiego di Indici Chiavi primarie e integritŕ referenziale...
ma che database usi?
???
-- 
Il Wodkino Nazionale č a : 
www.martek.it


 ma che database usi?
Interbase (.gdb)
Ciao :)

 Ciao :)
Un Delphomane qui ....arrrgh!
che ci fai su un NG di vb?
Già letto questo?
http://www.interbase-world.com/en/articles/805.php
-- 
Il Wodkino Nazionale è a : 
www.martek.it
