Newsgroup: it.comp.lang.delphi
Titolo: Inserimento nuovo articolo

Ciao a tutti,
  nella mia applicazione e' prevista la possibilita' di inserire un nuovo 
articolo.
Questa applicazione risiede su server e viene lanciata sui client 
interessati, questo significa che puo' essere lanciata da 2-4 pc diversi.
In lettura nessun problema, cosi' anche in fase di scrittura .... tuttavia 
ieri si e' proposta una situazione particolare.
Nello stesso momento due postazioni hanno inserito un nuovo articolo e si e' 
creato un grosso problema.
Infatti entrambi gli articoli hanno preso lo stesso numero perche' quando 
salvo l'articolo salvo anche il progressivo.
Quindi, per evitare questa situazione, pensavo durante la fase di 
inserimento di bloccare la tabella o, comunque, mettere da qualche parte un 
flag che non permetta un nuovo inserimento.
Problema, se il pc da cui sto inserendo (e quindi ha bloccato la tabella o 
messo il flag) per qualsiasi motivo si scollega o si spegne .... come posso 
fare per riaprire la tabella o resettare il flag per sbloccare la procedura 
di inserimento?)
 
Grazie
 
Ciao
 
Daniele 
 


Dovresti cambiare totalmente la logica che utilizzi e poi specificare che database usi se il codice articolo viene da un'altra tabelle se sei in transazione ecc ecc. Cosi sarebbe piu facile darti la soluzione.
In tutti i casi cominciamo dalle basi.
Se non ho capito male tu assegni il codice dell'articolo all'insert, presumo che che questo codice sia la chiave primaria o parte di essa se non e cosi e lo stesso.
Sbagliato, dovrestti assegnarlo nel beforepost controllando se sei in insert.
In questo modo, il lasso di tempo per aggionare questo sequenziale diventa minimo diminuendo di molto la probabilita di averne un lock o peggio due articoli con lo stesso codice (nel caso il codice non sia chiave).
Se sei in transazione allora sarebbe il caso di impostare il lockwait a true cosi che, se comunque hai un conflitto, la seconda transazione si ferma attendendo che l'altra transazione va in commit. Cosi facendo non bloccheresti nessuno. 
Ma tutto questo e presunto visto che non e dato sapere cosa usi e come lo usi. 

Ciao,
 
[]
Dovresti cambiare totalmente la logica che utilizzi e poi specificare che 
database usi se il codice articolo viene da un'altra tabelle se sei in 
transazione ecc ecc. Cosi sarebbe piu facile darti la soluzione.
In tutti i casi cominciamo dalle basi.
Se non ho capito male tu assegni il codice dell'articolo all'insert, presumo 
che che questo codice sia la chiave primaria o parte di essa se non e cosi e 
lo stesso.
Sbagliato, dovrestti assegnarlo nel beforepost controllando se sei in 
insert.
In questo modo, il lasso di tempo per aggionare questo sequenziale diventa 
minimo diminuendo di molto la probabilita di averne un lock o peggio due 
articoli con lo stesso codice (nel caso il codice non sia chiave).
Se sei in transazione allora sarebbe il caso di impostare il lockwait a true 
cosi che, se comunque hai un conflitto, la seconda transazione si ferma 
attendendo che l'altra transazione va in commit. Cosi facendo non 
bloccheresti nessuno.
Ma tutto questo e presunto visto che non e dato sapere cosa usi e come lo 
usi.
[]
 
Il codice e' chiave primaria e anche unico, un codice un articolo.
Il codice e' un numero sequenziale da 1 a n e l'ultimo numero e' salvato in 
record.
All'inserimento leggo l'ultimo numero e lo incremento.
Quando salvo l'inserimento aggiorno il record con il nuovo numero.
Il problema che si e' verificato e' che, in anni di funzionamento, e' 
capitato che nello stesso momento si sono codificati 2 articoli nuovi su 2 
pc diversi.
Pensavo al lock della tabella ma anche questa strada sembra non ottimale 
perche' se perdi la connessione la tabella rimane comunque bloccata e non so 
come sia possibile rimuovere le dead lock.
E' anche vero che un'altra situazione simile chissa' quando potra' 
ricapitare !!!!
 
Per il DB uso TurboDB della Dataweb.
 
Ciao e grazie
 
Daniele 
 


Bloccare la tabella è proprio il metodo peggiore di gestire qualsiasi cosa, e ancora decisamente peggio se utilizzi metodi casarecci.
Rifletti insieme a me.
Quello che fai è riassumibile in:
Fai l'insert, leggi il numero che ti serve, lo assegni nel campo codice, perdi alcuni secondi poi fai il post (alcuni secondi, se va bene, di possibile conflitto).
Sbagliato.
Fai l'insert e assegni il codice a 0, poi in BeforePost della tabella articoli leggi il sequenziale e lo aggiorni assegnando in quel momento il codice articolo (alcuni millisecondi di possibile conflitto).
Non conosco turbodb ma so che ha le transazioni. Con quelle, usandole, è possibile gestire i lock senza inventarti niente.

Ciao,
 
[]
Bloccare la tabella è proprio il metodo peggiore di gestire qualsiasi cosa, 
e ancora decisamente peggio se utilizzi metodi casarecci.
Rifletti insieme a me.
Quello che fai è riassumibile in:
Fai l'insert, leggi il numero che ti serve, lo assegni nel campo codice, 
perdi alcuni secondi poi fai il post (alcuni secondi, se va bene, di 
possibile conflitto).
Sbagliato.
Fai l'insert e assegni il codice a 0, poi in BeforePost della tabella 
articoli leggi il sequenziale e lo aggiorni assegnando in quel momento il 
codice articolo (alcuni millisecondi di possibile conflitto).
Non conosco turbodb ma so che ha le transazioni. Con quelle, usandole, è 
possibile gestire i lock senza inventarti niente.
[]
 
Hai ragione, il sequenziale lo posso  assegnare al momento del post.
In effetti non ci avevo pensato (ma il confronto serve anche a questo).
In questo modo, per il nostro tipo di lavoro, dovrei azzerare il conflitto.
 
Ti ringrazio per l'aiuto.
 
Ciao
 
Daniele
 
PS: Se passi da Como caffe !