Newsgroup: it.comp.lang.visual-basic
Titolo: [Teoria & partica] Ancora su concorrenza e dintorni...LUNGO!

Scusa te se apro un nuovo post ma mi sembra utile farlo.
Vorrei ragionare con voi di qualcosa che non sia il solito "come faccio ad
ordinare una datagrid?"
Sono alla ricerca di un minimo di un "optimum" che sia anche fattibile per
uno come me.
Tutti nasce da una esigenza pratica...2 "programmilli" gestionali che
verranno fatti girare su ora 5 macchine e in futuro con
l'arrivo di nuovi pc su un totale di 15 pc...tutti (per fortuna) nella
medesima intranet....senza dominio(è così che ci posso fare).
Io come ho già detto essendo di esperienza "A cessiana" ho sempre impostato
Keyset optimistic (pochissime volte pessimistic)...e gestito l'errore.
Essenzialmente quindi compariva un msgbox che avvertiva dell'impossibilità
di aggiornare il record...e a seconda dei casi si perdeva l'input o si
riprovava ad inviarlo.
Ora leggendo e meditando...mi sorgono un sacco di dubbi.
Nel senso:
Uno dei programmilli è il classico DDT e Fatturazione...e gestione ordini...
Ho dato un occhiata ad un sw che costa 2500 Euri +1000 a postazione....
non si baca tanto le palle...se una postazione è ad inserire gli ordini
ricevuti di una ditta....su quella ditta le altre postazioni non inseriscono
nulla...anche se è un ordine diverso!
Io attualmente ho a disposizione MSDE che per 5 postazioni va bene....quando
passerranno a 15 acquisteranno (problemi loro e del loro commerciale)
SQLserver
Ora c'è un altra ditta che probabilmente (tutto ancora a livello iniziale) è
interessato al sw-ino....però ha un server Dbase con Oracle (8 possibile?)
Sto pensando di riscrivere il sw per la versione "full" con posti di lavoro
illimitati (beh insomma max 255)
QUINDI....
io pensavo : Ho un Vb6 e ADO 2.7(anzi 2.8)....
Se utilizzo le feature di MSDE....probabilmente mi gioco Oracle e
viceversa....e se comunque domani voglio passare (mi capita un cliente
con...)a mySql?
Allora io pensavo:
a) L'SQL lo rendo il più possibile piano e standard...SELECT INSERT UPDATE
b) Le tabelle le rendo il più possibile standard (tipi di dato comuni il più
possibile fra i vari db)
c) E concorrenze e robe varie???????
Ecco la questione che volevo discutere con voi
A me non piace (garba ) affatto che una postazione non possa lavorare su un
ordine diverso...lo so che con un bel pessimistic sarei a cavallo...ma
sembra andar di scure
dove ci voglion le forbici!
Mia soluzione teorica da fanatico del p2p:
1) ServerActiveX...tutti i client Winsock collegati...
2) Client
3) Motoredb qualsiasi
il server sta sulla solita macchina del DB (facciamola facile) che quindi è
un similserverDB
Il server accetta con un suo protocollo le richieste dal client
ad es
POS01-A-5655FDR-RECPOS01.XML
Postazione 01 chiede di aggiornare il record con chiave 5655FDR piazzato nel
file xml
a)il server legge una sua tabella interna di cose da fare (va bene fatta
anche in access o un file di testo...o un + figo file xml)
vede che nessuno ha una cancellazione da effettuare su quel record
b)Il server controlla che nessuno stia modificando prima della postazione il
record
b-bis) Se qualcuno sta modificando controlla un eventuale timeout per
prevenire deadlock
b-ter) Se tutto ok scrive nella lista che POS01 sta mandando il file da
aggiornare
c) Comunica al cliente POS01 "Dammi il file xml"
d) aggiorna b-ter con il file contenente il record da aggiornare
Periodicamente il server
...oppure UN ALTRO SERVER (un simil demone di linux...un servizio)....
legge la lista di cose da fare...e praticamente...poichè accede solo lui al
DB (tutto di fatto è MONOutente)...se ne frega allegramente della
concorrenza
Fatte le sue cose aggiorna la lista comunicando al client che ha fatto e
resta in attesa di ulteriori comandi
IMHO
c'è il vantaggio che ti svincoli dal DB...in pratica il server con ADO apre
una conn verso il DBlocale...
C'è il vantaggio che a parte gli archivi di max2GB MSDE regge anche + di 8
connessioni come invece sarebbe presto esaurito nella soluzione connessione
da client.
SVANTAGGI:
casino ed attenzione nel programmare questi almeno 2 serverActivex (gestore
richieste client...gestore esecuzione richieste)
Velocità tutta da provare...mie prove con 3 client non erano male con un
abbozzo di sistema di test
il winsock si ferma a 255 connessioni (ma è il meno)
Si perdono tutti i vantaggi di una soluzione basata sulle feature di un DB
Non c'è criptografia della connessione (credo ci voglia poco ad
incrementrla)
Tutto sto ambarandan poi si potrebbe trasformare in classi e classettine ed
arrivare (se già non lo è)...ad una sol 3tier
Mi sto illudendo?
Che ne pensate di una soluzione del genere?
In pratica è buttare via le potenzialità di ogni motoredb...ma in teoria mi
impedirebbe di fare versioni diverse per DB diversi (io non ho una struttura
sw alle spalle..o meglio: la struttura son io!.io son programmatore
commerciale "uomo di fatica" tutti insieme!...se sto una settimana un mese
un anno a programmare il resto rimane indietro!)
Saluti e grazie della pazienza di chi sarà arrivato fin qui a leggere!
-- 
------------------------------------------------
Il Wodkino Nazionale è a : 
www.martek.it
Pagina Vb/Bestiario/Lamer Experience :
http://www.martek.it/go.asp?portamia=2
 New Entry nel bestiario!
:-)

 Scusa te se apro un nuovo post ma mi sembra utile farlo.
vari errori di "itagliano" in tutto il post dovuti a carenza di sonno!
sorry!

[MEGACUT]
Ho letto tutto lo scibile che hai scritto :) e non la vedo tanto tragica ..
Per quanto riguarda i vantaggi derivanti da ogni db che usi quelli li 
puoi implementare direttamente sulla macchina che dici essere il tuo 
server DB.
Sembra una soluzione semi ottimale nel senso che non saprei se impiego 
meno tempo a crearmi tutta questa architettura o a crearmi un motore di 
gestione concorrenze errori e cacchi vari su db specifici.
Mi spiego io ho sempre usato questo metodo (giusto o sbagliato lascio ai 
posteri la senteza).
[ESEMPIO STUPIDO E BANALE]
Un utente sta modificando un record quindi quando preleva il record 
segno in una tabella di controllo il record scelto.
Se nel frattempo un utente cerca di eliminarlo viene avvisato che il 
record è in modifica e non è possibile farlo.
[/ESEMPIO STUPIDO E BANALE]
Questo è un semplice esempio ed in merito alle considerazioni che tu hai 
posto davvero non saprei quale sia la scelta migliore.
Anche se ora sto usando .NET e quindi si potrebbe lavorare disconnesso 
ma si pone lo stesso problema della concorrenza quando andrò ad 
aggiornare i db in cui ho lavorato disconnesso.
Ti ripeto sono più orientato alla soluzione di crearmi dei controlli ad 
hoc in una classe generica ed usare quella che ottimizzo per i vari db 
che volgio usare e gestire gli errori ma la tua soluzione non è da 
prendere sottogamba (parere personalissimo) ...
--
[CapoBecchino]

 Saluti e grazie della pazienza di chi sarà arrivato fin qui a leggere!
ti invierò una fattura per il tempo impiegato...
-- 
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

 Scusa te se apro un nuovo post ma mi sembra utile farlo.
[cut]
Taglio tutto e inizio a divagare in ordine sparso.
In linea di massima, esistono concetti, soluzioni, strategie, che consentono 
di ridurre al minimo i casini di concorrenza.
Nel senso che molto spesso č possibile disegnare la struttura, in modo che 
due operazioni 'concorrenti' generino comunque uno stato finale valido. 
Spesso, la stessa idea č utile perchč consente che una operazione, eseguita 
per errore due volte, porta comunque ad uno stato valido.
Non so indicare un metodo preciso per realizzare questa cosa. Diciamo che si 
tratta di un insieme di elucubrazioni, riflessioni, ipotesi, che portano a 
trovare la soluzione migliore. Ci si arriva ponendosi sempre, ad ogni bivio, 
il dilemma "e se questa cosa la fanno in due?", "e se questa cosa viene 
fatta due volte?".
Proseguiamo.
Esistono comunque situazioni in cui la concorrenza *deve* essere gestita.
Come giustamente ipotizzavi: due ordini che vanno a cercare la disponibilitŕ 
di materiale, con due clienti al telefono con due operatori diversi. "Sě, la 
roba č disponibile"->"Conferma ordine"->Ahia....
La soluzione in questi casi andrebbe demandata al dbms.
Su questo sono discretamente convinto. Il dbms č l'unico che sa esattamente 
come sono i dati, che conosce eventuali transazioni, lock, ecc...
La cosa piů potente, in questi casi, sono le StoredProcedure. Una SP č in 
grado di fare lock, update, unlock, come una singola operazione atomica, 
restituendo un valore, un recordset, un qualcosa che indichi al client 
l'esito.
E le SP sono supportate da MSDE. A proposito, MSDE mette in attesa il nono 
processo in esecuzione e i successivi, ma se fai un sp_who2 in un momento in 
cui il sistema č carico (secondo te), vedrai che i processi conteggiati 
(ossia quelli con spid>=50) sono al 95% in "WAITING", quindi non rientrano 
negli 8 parallelizzati. Per le dimensioni aziendali di cui parli, l'unico 
vero limite sono i 2GB per database (qualora i dati possano raggiungere 
questo livello), e la mancanza degli OLAP, ma per il discorso delle 
connessioni puoi dormire mille volte tranquillo.
Ma c'č un 'ma'.
Le SP sono supportate da MSDE/Sql-Server, *ma* solo da MSDE/SQL-Server.
Oracle, DB2, altri giochini, non le supportano. Magari si possono realizzare 
strutture simili, nelle rispettive architetture, ma vanno comunque rifatte a 
seconda dei casi. E questo č male.
Allora subentra un'altra cosa, meno 'facile' ma *molto* potente: i trigger. 
I trigger sono supportati, con minime differenze sintattiche, da 
MSDE/Sql-Server, Oracle, DB2, e presumo anche da altri.
E i trigger sono forti, molto forti, quando ti serve di eseguire controlli, 
eseguire roba batch, ecc...
Spero di essere stato utile.
Ciao
Alberto
-- 
E tutto mi sembrava andasse bene... 

 Saluti e grazie della pazienza di chi sarà arrivato fin qui a leggere!
Peccato che l'altra sera non sei potuto venire alla cena... avremmo avuto 
un bel argomento di discussione ;)
Ciao!
-- 
Gianluca Cannalire
Microsoft MVP/MCP - Visual Basic
http://www.visual-basic.it
http://community.visual-basic.it/gianluca

 Ciao!
...non "rintignare" che son parecchio caffeinizzato di questi tempi!
E la notte le poche ore che dormo mi sogno di correre a perdifiato!
Della serie "bastaaaaaaaaaaaaaa voglio una vacanzaaaaaa"

 7) chiusura db
anche io (ignorantissimo in gestione db) uso questo sistema, pero' scusa mi 
sorge un dubbio:
tra il punto 4 e il 5 magari il record "corrente" potrebbe essere stato 
cancellato o peggio modificato da un altro client.
Come lo gestisci ?
Cioe' mi capita di vedere delle mie utenti che aprono da un master-detail un 
ordine in modifica e lo lasciano li' per tutta la giornata, alle 6 di sera 
si ricordano di chiuderlo premendo salva e a volte vanificando modifiche 
fatte da altri client.
Io ho sempre gestito questi problemi alla radice, formando il cliente. ^_^;
Pero' a volte un sistema a code come quello di wodka ma moooolto + 
semplificato e' utile.
Io uso il "semaforico": un flag nelle tabelle che ne indica lo stato. Il 
flag viene valorizzato quando si entra in un qualsiasi stato di editing 
(clicco sul bottone nuovo o modifica) e viene azzerato quando si salva o si 
annulla la fase di editing.
Per ora questa soluzione l'ho usata solo in un programma di ristorazione in 
cui gli ordini (le comande) variavano da 3 posti diversi (cassa cucina e 
camerieri) in tempi brevi. Per ora la cosa funziona bene, mi ha risolto il 
problema dei conflitti e in un modo molto comodo. Se la cucina sta 
modificando un ordine e' giusto che la cassa e il cameriere aspettino e 
visualizzino le modifiche prima di andare avanti.
Cmq ritornando in tema, il metodo di wodka mi sembra troppo laborioso, il 
mio metodo con flag semaforico troppo semplicistico... bho... non saprei 
sinceramente su cosa puntare, io di solito (data la mia inesperienza) uso 
Sql semplicissime, lavoro disconnesso e spero che i miei clienti abbiano un 
po di cervello. Per ora (avro' una 40ina di persone che lavorano 
giornalmente sui miei 3-4 sw gestionali, non d+) i problemi son quasi 
inesistenti, certo alzando il livello e il bacino d'utenza immagino cambino 
in grandezza e anche di molto.
-- 
[Gigio2k]
http://www.g2kweb.it
[ it-alt.comp.hardware.modding ] - 
http://www.g2kweb.it/ichm
 

 cliente. ^_^;
Non la vedo un'ottima soluzione :)
