Gambas-it

Archivi (sola lettura) => Programmazione (Gambas 2) => Topic aperto da: dex - 20 Settembre 2010, 13:30:27

Titolo: Mysql in Rete
Inserito da: dex - 20 Settembre 2010, 13:30:27
ciao raga.

devo realizzare una rete di pc (3) e Mysql.
In pratica sui 3 pc deve girare il mio programma, e tutti  devono usare lo stesso database (MySql), che deve essere su un HD esterno collegato via lan ai pc. I 3 pc si troveranno nella stessa sede quindi sarà una lan interna.

Inoltre sullo stesso database è presente una tabella con un numero incrementativo (no id, ma lo incremento io da codice), dovrei fare in modo che il numero sia univoco, e se un pc sta registrando dati su quella tabella il secondo pc deve prenotare il numero successivo.

Piccolo esempio: ultimo numero registrato 95, primo pc apre il form per l'inserimento dati e prenota il 96, secondo pc apre e prenota il 97, terzo pc prenota il 98.
Questo solo se più pc aprono lo stesso form, altrimenti si scrive ultimo numero + 1.
Titolo: Re: Mysql in Rete
Inserito da: ealmuno - 20 Settembre 2010, 13:39:10
Un database mysql di per se non è accessibile dall'esterno, ma modificando qualche parametro lo diventa (è per motivi di sicurezza), se non sbaglio è già stato trattato qui sul forum questo argomento.
Essendo in lan non dovresti avere altri problemi.
Sempre se non sbaglio al secondo problema dovrebbe arrangiarsi da solo il database.
Titolo: Re: Mysql in Rete
Inserito da: dex - 20 Settembre 2010, 14:16:48
Sempre se non sbaglio al secondo problema dovrebbe arrangiarsi da solo il database.

ma dovrei settare qualcosa o impostazioni varie?
non credo che il database possa arrangiarsi da solo su una comune tabella non autoincrementante.
Titolo: Re: Mysql in Rete
Inserito da: ealmuno - 20 Settembre 2010, 14:26:43
avevo letto male, scusa.
Ma perché non lo lasci incrementare in automatico?
Dipende da come gestisci il tutto. L'id quando lo aggiungi, quando inserisci tutti i dati o lo scegli prima?
Comunque per me conviene incrementarlo in automatico.
Titolo: Re: Mysql in Rete
Inserito da: dex - 20 Settembre 2010, 14:34:21
non posso farlo autoincrementare
deve seguire una numerazione interna che deve corrispondere a un registro cartaceo.

l'id ha un difetto, se si cancella un record quel numero è perso, il database passa al successivo e non corrisponderebbe più al registro cartaceo.
Inoltre in azienda per esigenze fiscali quando iniziamo un nuovo registro cartaceo partiamo dal primo di quel registro che può non essere progressivo con il vecchio registro.
Titolo: Re: Mysql in Rete
Inserito da: md9327 - 20 Settembre 2010, 14:34:45
L'unico modo è salvare la prenotazione su un'apposita tabella dello stesso db.

Il problema però è: se l'inserimento non viene completato, il numero prenotato che fine fà?

Inoltre: quale e quanta importanza ha questo numero?


Ops... un altro metodo è il lock della tabella...
Titolo: Re: Mysql in Rete
Inserito da: Ceskho - 20 Settembre 2010, 15:20:59
Secondo me dovresti fare così:

- Il computer 1 (d'ora in poi C1) apre il form dell'inserimento...
- Al server dove risiede il database (d'ora in poi SER) viene spedito un segnale che "mantiene occupato in memoria" un id intero
- computer 2 (C) apre il form dell'inserimento e legge il valore in memoria sul server.....lo incrementa.....
- C2 finisce di fare il suo lavoro ma la sua operazione rimane in sospeso perchè c'è ne una già aperta in precedenza.
- Se C1 finisce positivamente il suo lavoro allora i dati vengono salvati con il giusto ordine di ID altrimenti C2 prende il valore dell'ID che veniva mantenuto da C1

Spero di essere stato chiaro....è solo una delle tante idee utilizzabili....
Titolo: Re: Mysql in Rete
Inserito da: Golia - 20 Settembre 2010, 15:47:15
Secondo me se il numero incrementativo viene salvato nella tabella (e penso che sia così), dovrebbe essere la stessa cosa che con un id autoincrementante. Basta che il numero venga scritto nel momento che dai salva, controllando nel database il numero maggiore. Se il pc1 salva con il numero 15 (perchè aveva trovato che il numero maggiore era 14) e dopo 1 secondo il pc2 salverà col numero 16 perchè troverà il numero maggiore 15. Almeno credo sia così
Titolo: Re: Mysql in Rete
Inserito da: md9327 - 20 Settembre 2010, 16:28:43
Sarebbe più semplice se il numero si potesse definire in fase di memorizzazione. Se non necessiti di farlo vedere immediatamente, durante l'insert potresti crearlo al volo, lockando momentaneamente la tabella in scrittura...
Titolo: Re: Mysql in Rete
Inserito da: dex - 20 Settembre 2010, 17:14:46
Sarebbe più semplice se il numero si potesse definire in fase di memorizzazione. Se non necessiti di farlo vedere immediatamente, durante l'insert potresti crearlo al volo, lockando momentaneamente la tabella in scrittura...
il numero mi serve alla fine, dopo il salvataggio del record, anche i dati vengono prima scritti nei vai controlli del form e quando l'utente preme salva prima da codice viene effettuato un controllo sull'esattezza dei dati e poi salva.

in effetti l'accesso al database richiede pochissimo, finche i tre pc inseriscono dati nel form nessuno si collega al database, solo al momento del salvataggio. E dato che il salvataggio richiede poco nel caso che pc2 salvi i dati si può mettere in attesa con un sms.

un po simile al suggerimento di ceskho, solo che non ho capito che segnale mandare al server.

Come posso bloccare la tabella? con begin?

@Golia
si il numero è tipo incrementativo io controllo nel database con una query maxnumero e aggiungo 1.
ps ho scaricato la tua guida su mysql in rete, ben fatta e facile da usare, unica cosa dato che io devo mettere il server MySql su un HD esterno come faccio ad installarlo?
Titolo: Re: Mysql in Rete
Inserito da: Golia - 20 Settembre 2010, 17:36:08
Citazione
unica cosa dato che io devo mettere il server MySql su un HD esterno come faccio ad installarlo?
Mi spiace ma non ho idea, provo a cercare. Ciao
Titolo: Re: Mysql in Rete
Inserito da: Ceskho - 20 Settembre 2010, 18:06:58
Citazione
unica cosa dato che io devo mettere il server MySql su un HD esterno come faccio ad installarlo?
Mi spiace ma non ho idea, provo a cercare. Ciao
[/quote]

Lo salvi in locale e sull'hard disk ci fai una copia di backup....
Titolo: Re: Mysql in Rete
Inserito da: dex - 20 Settembre 2010, 20:06:53
@Ceskho
salvandolo in locale dovrei scegliere un pc dove mettere il Database, il problema è che non sempre tutti i pc sono accesi, solo nei giorni di megalavoro, e mettendolo su un singolo pc lo dovrei tenere sempre acceso.
inoltre mi serve su hd esterno in quanto posso montarlo in una minicassaforte o armadio blindato.
Titolo: Re: Mysql in Rete
Inserito da: Ceskho - 20 Settembre 2010, 20:07:59
inoltre mi serve su hd esterno in quanto posso montarlo in una minicassaforte o armadio blindato.

Questi sono i problemi di quando si lavora all'FBI....:rotfl:
Titolo: Re: Mysql in Rete
Inserito da: Golia - 20 Settembre 2010, 21:26:29
Mi sa che più che hd esterno, ti ci vuole un pc che faccia da server..
Titolo: Re: Mysql in Rete
Inserito da: dex - 20 Settembre 2010, 22:02:53
inoltre mi serve su hd esterno in quanto posso montarlo in una minicassaforte o armadio blindato.

Questi sono i problemi di quando si lavora all'FBI....:rotfl:

FBI? e chi sono quei pivelli?, noi siamo molto più in alto e più Importanti, noi siamo SPD.
Sfruttamento Poveri Disperati. (il disperato sono io  :'( :'().

a parte gli scherzi, ci sono stati molti furti nella zona, e spesso si sono portati via pc e stampanti, ora tutto il parco hardware vale si e no 3/4 mila €.
La perdita dei dati è incalcolabile, non solo per il povero sottoscritto, che dovrà fare varie nottatacce per recuperare, ma anche per l'azienda, che nel caso di divulgazione dei dati potrebbe essere denunciata dai cliente per violazione della privacy.

@Golia
in effetti ho ordinato un HD che il venditore mi ha detto che loro già lo usano come server e che si possono configurare anche utenti, non so ancora come funziona ma appena arriva male che va lo smonto e lo monto sotto un pc, dopo che ho installato ubuntu senza password ci carico MySql.
Titolo: Re: Mysql in Rete
Inserito da: md9327 - 21 Settembre 2010, 15:40:06
In MySQL, quando crei il database, puoi indicargli quale tablespace usare, e nel tuo caso, su quale disco.

Basta che tu monti la partizione del disco (opportunamente formattata, ovviamente), in una determinata e precisa directory, su cui mysql punta il suo db.
E' sottinteso che la partizione deve essere presente prima che mysql venga avviato, ma questo non credo sia un problema, se il mount lo fai gestire dal sistema, inserendo gli opportuni parametri in fstab.
Titolo: Re: Mysql in Rete
Inserito da: dex - 21 Settembre 2010, 19:37:29
@md9327
Quindi non dovrebbe essere difficile usare l'hd, al limite ci devo smanettare un pò per farlo partire.

Per bloccare la tabella ed evitare la scrittura in contemporanea?
Titolo: Re: Mysql in Rete
Inserito da: md9327 - 22 Settembre 2010, 00:27:14
In teoria, ma è da testare per il tuo caso specifico, già il fatto di andare ad aggiornare il numerello in fase di inserimento dovrebbe coprirti le spalle.
Quando un rdms, di fatto, và ad aggiornare il database, di fatto blocca temporaneamente il file, tenendo in coda le richieste successive.

Nella stessa INSERT, dovresti mettere l'istruzione "select campo + 1 from tabella", direttamente nello stesso comando insert.

Ad esempio:
Codice: [Seleziona]
INSERT INTO tabella VALUES ((SELECT MAX(numero)+1 FROM tabella), ... altri campi)

Questo, se te lo permette la versione del db, dovrebbe assicurarti l'unicità e la sequenzialità del numerello.

In alternativa, dovresti poter lockare temporaneamente la tabella (esistono comandi appositi), e con un'unica sessione determinare prima il numero da inserire, e poi salvarlo con l'insert. Questa seconda alternativa ti permette di conoscere immediatamente il numero utilizzato, mentre con la prima non lo puoi sapere.

I rdbms più evoluti (vedi PostgreSQL e MySQL), attraverso i trigger e le funzioni, potenziano di molto queste possibilità, permettendoti di creare apposite procedure che fanno i dovuti controlli e gli inserimenti necessari, indipendentemente dal programma. Questo perchè risiedono sul server, e non sui client, per cui sono slegati da false tempificazioni.