fdm.tesiti.AppendRecord([....]);
fdm.tesiti.applyupdates(8);
fdm.lab_anno.transaction.commitretaining;
fdm.tesiti.Close;
fdm.tesiti.Open;
Aggiungo, una cosa che ho ricordato adesso, che potrebbe aiutare a chiarire la situazione.
La stessa cosa mi succedeva con un vecchio progetto in Delphi3 che accedeva a Mysql con gli ODBC.
Codice: [Seleziona]fdm.tesiti.AppendRecord([....]);
fdm.tesiti.applyupdates(8);
fdm.lab_anno.transaction.commitretaining;
fdm.tesiti.Close;
fdm.tesiti.Open;
//Ora posso fare la sostituzione.
//Preparo l'istruzione SQL
SqlQueryUpdate.UpdateSQL.Clear;
SqlQueryUpdate.UpdateSQL.Add('update ' + CstNomeTabellaDaSist);
SqlQueryUpdate.UpdateSQL.Add('set ' +
CstNomeColonnaDaSist +
' = ' +
MettiVirgolette(CstValCampoNew, tvSemp));
SqlQueryUpdate.UpdateSQL.Add('where ' + CstNomeColonnaDaSist + ' = ' +
MettiVirgolette(CstValCampoOld, tvSemp));
//Scrivo la modifica
//SqlQueryUpdate.UpdateSQL.SaveToFile(WinTemp + 'Mario.txt');
SqlQueryUpdate.Open;
SqlQueryUpdate.Edit;
SqlQueryUpdate.Post;
SqlQueryUpdate.ApplyUpdates;
SqlQueryUpdate.Close;
//Ora che ho finito di leggere il DB, lo posso aggiornare (COMMIT)
SQLTransaction1.CommitRetaining;
SqlQueryUpdate.Edit;
SqlQueryUpdate.Post;
Si, uso lab_anno, che è una TMySql50Connection, per la commit, mentre tesiti che è una TSqlQuery per l'append dei nuovi record. Secondo te dovrei fare diversamente?
Buongiorno a tutti,
in un nuovo progetto, ho un database Mysql con diverse tabelle, di tipo MyIsam, alle quali accedono alcuni client, anche una decina, con dei mie programmi.
Il problema è che, circa l'uno percento dei record aggiunti, non vengono poi ritrovati.
Essendo che ci sono tabelle anche con 900.000 record, il problema diventa frequente.
I programmi girano sotto Windows 64 bit e 32 bit, sono compilati per 32 bit con la versione 2.0.6.
Uso i componenti nativi, non quelli Zeos, e il codice che uso per salvare segue questo semplice schema:Codice: [Seleziona]fdm.tesiti.AppendRecord([....]);
fdm.tesiti.applyupdates(8);
fdm.lab_anno.transaction.commitretaining;
fdm.tesiti.Close;
fdm.tesiti.Open;
L'argomento 8 della funzione applyupdates è stato inserito per cercare di correggere il problema ma non risolve.
Grazie in anticipo.
Ma appunto dal mio provenire dall'ISAM, e non ho mai cambiato atteggiamento, ho sempre ed esclusivamente SCRITTO nel database attraverso UNA E UNA SOLA FUNZIONE, NORMALMENTE TRAMITE UN THREAD, serializzata da un semaforo in modo tale che il programma eseguisse le attività di scrittura da un solo LUOGO e in un solo istante.
Io suderei freddo a perdere un singolo record. Perderne migliaia... :o
Non è che per caso imposti dei valori non validi nel record da aggiungere e l'operazione fallisce?
Ad esempio un valore non unico in un campo indicizzato unico, o un valore nullo in un campo non nullo?
E non te ne accorgi perchè non controlli che l'operazione sia andata a buon fine, ad esempio con RowsAffected?
Non è che per caso imposti dei valori non validi nel record da aggiungere e l'operazione fallisce?
Ad esempio un valore non unico in un campo indicizzato unico, o un valore nullo in un campo non nullo?
Non penso che sia questo perché ripetendo la stessa scrittura, con gli stessi dati, non succede.
In pratica una volta su tante la scrittura non va a buon fine, anche se scrivo sempre le stesse cose.
Ma appunto dal mio provenire dall'ISAM, e non ho mai cambiato atteggiamento, ho sempre ed esclusivamente SCRITTO nel database attraverso UNA E UNA SOLA FUNZIONE, NORMALMENTE TRAMITE UN THREAD, serializzata da un semaforo in modo tale che il programma eseguisse le attività di scrittura da un solo LUOGO e in un solo istante.
Ma tu intendi che per ogni client scrivi sempre con un solo thread su di una sola tabella alla volta oppure serializzi la scrittura ad una tabella (o a tutto il database) per tutti i client in rete?
Dunque i valori che inserisci sarebbero validi
A me sembra un errore di valori duplicati su un campo indicizzato.
Ad esempio, per qualche motivo non hai usato i campi chiave autonumeranti e i client generano autonomamente delle chiavi per identificare i record, ma non hai un meccanismo che garantisca che queste chiavi siano effettivamente uniche nella tabella. Il meccanismo che usi funziona bene normalmente (al 99%) ma ogni tanto saltano fuori chiavi identiche su client diversi e l'append fallisce
Intendevo per operazioni effettuate da un singolo client direttamente dall'applicativo. Lasciando per un attimo perdere i client su rete, già con un solo client puoi avere problemi se instauri più transazioni (ossia scritture multiple) contemporanee da più Thread: ovvio che dipende dal motore che scegli. Se usi Oracle o Microsoft con le versioni enterprise dei prodotti è certo che puoi fare più o meno quello che vuoi senza prestare bada ai Thread, ai client o ad altri dettagli.
Poi, pensando ad un sistema multiclient, le cose si fanno più complesse e occorre molto spesso migrare su database più performanti e sicuri.
Quindi se tu dovessi gestire un sistema multiclient scarteresti Mysql e Firebird. Cosa ne pensi di PostgreSql?
Comunque, da circa una settimana, ho eliminato l'accesso contemporaneo a due tabelle, da parte di un applicativo di un client.
Il rimedio sembra efficace anche se lo terrò ancora sotto controllo.
Io attualmente uso postgres per un'applicazione gestionale multi-utente utilizzata da una trentina di client qui in azienda e non ho mai avuto problemi
Ok, grazie.
Mi hanno fatto spaventare qualche anno fa, e da allora vado sempre con i piedi di piombo su queste cose !!!
Ciao, Mario