Newsgroup: it.comp.lang.visual-basic
Titolo: Scambio di opinioni ... voi come fareste per

supponete di avere un software che è stato progettato per
client singolo.
Ora se il db di questo software se messo su di un server
e altri client ci vanno a puntare sopra, tutti vedono le
informazioni e ci lavorano sopra nei limiti dei loro permessi
ad agire.
Ora supponete di voler fare in modo che se io sto su A
aggiungo una informazione e B ha la maschera aperta
in visualizzazione sopra ai dati per cui A ha appena aggiunto,
voi come fareste a dire ricarica la lista e mostrami i
nuovi dati?
Sarebbe bello avere delle variabili application :) come in
ambiente web, ma non ci stanno.
Pensavo ad una tabella di appoggio dove scrivo secco
l'ultima variazione in assoluto fatta su quella tabella, quindi
confrontare il valore recuperato al momento della select
fatta da B e se diversa perchè A ha aggiornato, rileggere i
dati. Ma rischio di fare un qualcosa di assolutamente "pesante"
o forse inutile.
Appunto, mi piacerebbe sapere voi come vi comportereste.
Ciao
Andrea 

 
Un problemino da poco!? :-)
Guarda qui
http://www.cs.wisc.edu/~dbbook/openAccess/firstEdition/slides/pdfslides/mod6l1-2.pdf
e qui
http://encyclopedia.thefreedictionary.com/Write-Write%20conflict
o piu' in generale google:
http://www.google.com/search?hl=en&lr=&q=overwriting+uncommitted+data&btnG=Search
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!


Premesso che non sono un esperto in materia di concorrenza, ad un
corso VB a una domanda come la tua la risposta era stata di aggiungere
alla tabella un campo timestamp che viene variato ogni volta che il
record viene aggiornato (se usi SQL Server dovrebbe gestire tutto il
server). A questo punto il tuo programma (se ha bisogno di vedere le
variazioni in tempo reale, perche' chiaramente e' un'operazione
piuttosto pesante) dovrebbe interrogare periodicamente il DB per
vedere se i record  sui quali sta lavorando hanno subito un
cambiamento e nell'eventualita' rileggere il record tenendo conto del
fatto che l'utente su B magari sta facendo delle modifiche ...
In ogni caso il controllo va sicuramente fatto prima di ogni UPDATE
sul record stesso.
Spero che ti possa servire
ciao

 Andrea
tutto quello che dico č IMHO
devi distinguere 2 problemi
1) Se il record č pubblico...ossia tutti lo possono leggere e scrivere senza
nessun vincolo
mi spiego:
si legge un campo Merce=100
a) lo mette a 101
b) lo legge....cosa legge? ancora 100 perchč la modifica č pendente...lo
mette a 99
cosa scrivere e cosa bloccare?
in questo caso vince la legge "chi prima arriva si serve"
in questo caso quindi chi prima scrive "vince"...ma come?
la cosa migliore č che il primo cliente blocchi per un attimo il
record...controlli la situazione di partenza...se non č cambiata...scrive e
sblocca
UpdateBatch e optimistic credo funzioni cosě
il client che si serve dopo deve ricontrollare e FAR DECIDERE (al 99%)
l'utente
"Attenzione il record corrente č stato modificato da un altra
postazione...aggiorno i  dati inseriti?
se ti dice di si fai scattare una procedura che automaticamente riequilibra
l'input....
ad esempio se aveva tolto 2 allo status iniziale lo toglie da quello che č
effettivo..."risimula l'input"
logico che ricontrolla tutte le volte perchč l'utente "dick fulmine"
potrebbe esser di nuovo arrivato prima di lui!
2) Il record č bloccato
č piů semplice.....
Perň prima di sbattergli la porta in faccia .....come fanno quasi tutti i sw
potresti inserrilo in una coda
gestire la concorrenza .....
la fai gestire dal DB.....
dal provider OLEDB.....(ado perň butta via un sacco di memoria e risorse)
oppure.......c'ho fatto un piccolo test tempo fa......
ti fai un tuo server activex (un 3tier) che pensa lui a gestire le scritture
sul db
questo caso č utile con motori db poco dotati per accessi multipli (tipo
Access...ma anche un file random...perchč no?)
tutto quanto imho
-- 
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"
---
Messaggio scannerizzato e certificato "Virus free" da AVG free edition.
Checked by AVG anti-virus system (
http://www.grisoft.com
).
Version: 6.0.775 / Virus Database: 522 - Release Date: 08/10/2004

Diciamo che il problema non è per la scrittura perchè li
ho gestito con un timestamp e chi primo arriva primo si
serve, che a mio avviso la cosa è estremamente pratica
in un ambiente distribuito, evitando inutili lock del tizio
che va a prendersi il caffè al bar.
Il dubbio era solo per la rilettura.
Supponiamo che A abbia inserito qualcosa, ma poco
prima B aveva letto una lista di possibili record ... ora
vorrei gestire il fatto che sul client di B, il programma
si accorga che A ha scritto e B rilegga la lista dei
record disponibili.
Così che se la ricarichi avendo una visione quanto più
realistica possibile.
Poi mi aspetto che se due utenti lavorino sullo stesso
record, il timestamp faccia il resto ... perchè il primo
che inserisce varia anche il timestamp di modifica che
è utilizzato per fare il check durante l'update.
Ciao
Andrea
P.S. la risposta vale per tutti ... ho risposto qua per
praticitià

 record disponibili.
cut
senti Andrea...io non sono un fanatico ne un esperto di basi dati (non son
laureato) e quanto ti sto per dire farà inorridire molti dottori!
Il tuo problema è "essere avvertito dei cambiamenti"...credo che vari motori
db attivino trigger vari...che cmq vannno letti....in automatico non credo
succeda nulla...ma mi posso sbagliare!...con Access non succede nulla!
ben io ho risolto in maniera pragmatica e molto probabilmente non
corretta...ma funziona!
Ipotesi:
sei multiutente
Tesi:
c'hai una rete!
allora...se hai il tuo serveractivex che gestisce la concorrenza...o la tua
classe...o quel che è liberamente spippolabile....
QUANDO....qualcuno scrive un attimo prima del LOCK(o dopo) del record che
comunque o tu o il db in automatico(o a richiesta) ti farà.....
MANDA un messagino winsock (anche udp) a tutti gli ip che son collegati
.....
ad esempio:
"WODKA BEGINWRITE AD34534"
Nome utente - azione - IDrecordinteressato
in questo modo avverti che stai scrivendo....e i tuoi utenti decidono di
conseguenza!...se vogliono...
MA questo solo se è importante che tu abbia un "evento" tracciabile quando
qualcuno fa "qualcosa"
NORMALMENTE
non serve fare questo...
un updatebatch e gestire gli errori basta!
ripeto è solo se vuoi l'immediatezza dell'evento trasmesso a tutti i client!
ehm...per i puristi
Scanso l'apertura dynamic perchè è un succhia risorse più di Zora la
Vampira!
...se posso lavoro disconnesso adirittura!
tutto quanto IMHO!
ciao!
:-)
-- 
Il Wodkino Nazionale è a : 
www.martek.it
