* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 18, 2024, 10:35:04 pm

Inserisci il nome utente, la password e la durata della sessione.

173 Visitatori, 0 Utenti

Autore Topic: Lavorare in rete  (Letto 6902 volte)

tito_livio

  • Full Member
  • ***
  • Post: 146
  • Karma: +3/-0
Lavorare in rete
« il: Novembre 27, 2019, 01:27:40 am »
Buongiorno,
con le nuove versioni di Lazarus ho questo problema:
Ho due applicazioni Lazarus: A e B che lavorano sulla stessa tabella mysql che chiamo attesa.
Uso come componente tsqlquery.
Quando B modifica attesa basta che nell'altra applicazione, A, eseguo   attesa.refresh   oppure   attesa.close; attesa.open,   ed i cambamenti sono visibili.
Fin qui tutto normale, e la versione di Lazarus che uso è 0.9.30.2 ed ha funzionato per lunghi anni.
Lo so, è una vecchia versione e volendo usarne una nuova ho installato la versione 2.0.6 e ricompilato i progetti.
Con questa versione però, l'applicazione A, quella che dovrebbe leggere i cambiamenti, legge sempre gli stessi record, il risultato della query non cambia.
Per "vedere" i cambiamenti devo chiudere e rieseguire A. Ho lo stesso problema anche con una versione intermedia: 1.6.
I sorgenti sono gli stessi, ho solo ricompilato con la nuova versione.
La query di A è questa:

select * from attesa
where chiamato='1'
order by data_chiamata desc, ora_chiamata desc

Cosa sbaglio?
Penso che molti di voi avranno affrontato il problema dell'uso concorrente di una tabella, in questo caso mysql ma dovrebbe essere lo stesso per firebird o altri dbms.

Vi ringrazio per l'attenzione

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Lavorare in rete
« Risposta #1 il: Novembre 27, 2019, 09:23:06 am »
Mi sembra di ricordare che si tratta di qualche livello di isolamento della transazione. Ora non posso controllare il mio codice. Ma se hai fretta e vuoi evitare di chiudere il programma la soluzione più grezza ma sicuramente efficace è chiudere e riaprire la connessione. Poi sarebbe utile sapere se:
usi ApplyUpdate dopo aver fatto degli update sul database. Se esegui il commit o il commitretaining, se hai impostato qualche valore non di default sul connettore. L'ideale sarebbe sempre fornire un esempio che replica il problema, in modo che possiamo analizzarlo e velocizzare l'isolamento del problema.
Ieri è passato, domani è futuro, oggi è un dono...

tito_livio

  • Full Member
  • ***
  • Post: 146
  • Karma: +3/-0
Re:Lavorare in rete
« Risposta #2 il: Novembre 27, 2019, 02:50:19 pm »
Grazie Xinyiman per la risposta, ti confermo che chiudendo e riaprendo la connessione funziona. C'è lo svantaggio che aprire e chiudere la connessione prende un po' di tempo in più rispetto a chiudere ed aprire la tabella (si nota). Inoltre, qui va bene perche il progetto è piccolo ma con progetti con diverse tabelle aperte diventa più complicato.
Uso ApplyUpdate e commitretaining e nella connessione imposto giusto il minimo indispensabile, cioè setto le proprietà: DatabaseName, HostName, Password, Transaction e UserName.

Allego un progettino di esempio dove tramite una DbGrid si possono modificare i contenuti della tabella. Ci sono poi due bottoni: Salva e Aggiorna.
Io l'ho compilato con Lazarus V1.6.
Basta lanciare il programma due volte (due istanze), se da uno si modifica e si clicca  "Salva", dall'altro, anche se si clicca "Aggiorna", le modifiche non appaiono a meno di chiudere e riaprire il programma.
Nell'esempio vanno riempite le proprietà HostName,Password,Username di mysqlconnection con i propri dati.
Grazie di nuovo.

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Lavorare in rete
« Risposta #3 il: Novembre 28, 2019, 08:12:00 am »
Ciao tito_livio. Allora ieri sera ho fatto una piccola prova cambiando il connettore. Ho usato sqlite perchè a casa non ho installato mysql. Ho usato lazarus trunk version e ha funzionato correttamente. Prova a compilare anche tu usando la trunk version di lazarus. Se anche così non ti funziona installerò mysql a casa e proverò con quel connettore cercando la differenza.
Ieri è passato, domani è futuro, oggi è un dono...

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:Lavorare in rete
« Risposta #4 il: Novembre 28, 2019, 10:20:43 am »
Ciao.Se il refresh() non funziona, prova il resync(..).
Fammi sapere
Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Lavorare in rete
« Risposta #5 il: Novembre 29, 2019, 08:30:57 am »
Ciao tito_livio. Ieri sera ho provato a fare delle prove a casa ed effettivamente si comporta come segnali tu (mysql 8 su ubuntu 18.10).
Sono sempre più convinto che sia un problema di isolation level. Con zeoslib saprei come risolvere ma con i componenti standard no. Infatti ho aperto un 3d sul forum internazionale:

https://forum.lazarus.freepascal.org/index.php/topic,47580.0.html

Così vediamo di estendere la richiesta d'aiuto ad una platea più ampia.
Ieri è passato, domani è futuro, oggi è un dono...

tito_livio

  • Full Member
  • ***
  • Post: 146
  • Karma: +3/-0
Re:Lavorare in rete
« Risposta #6 il: Novembre 29, 2019, 11:26:33 pm »
Ciao ragazzi,
ho provato con resync e non funziona ugualmente.
Buona l'idea di mettere il problema sul forum internazionale.
Forse funzionerebbe "distruggendo" l'oggetto sqlquery e ricreandolo, però sinceramente non so come si fa.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2382
  • Karma: +10/-0
Re:Lavorare in rete
« Risposta #7 il: Novembre 29, 2019, 11:44:56 pm »
Se hai bisogno di ricreare l'oggetto,
grossomodo dovresti procedere più o meno in questo ordine.
1) definisci la query la tieni in una stringa (magari in una costante).
2) crei un oggetto TQuery quando ti serve.
3) lo agganci ad un datasource (se devi collegare dei componenti visuali alla query)
4) Attivi la query.
5) Distruggi la query quando non ti seve più.
Stilgari
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Lavorare in rete
« Risposta #8 il: Dicembre 01, 2019, 12:34:01 pm »
Visto la risposta sul forum internazionale? Devi chiudere e riaprire sia la query che la transaction.
Ieri è passato, domani è futuro, oggi è un dono...

Diego1981

  • Full Member
  • ***
  • Post: 180
  • Karma: +0/-0
Re:Lavorare in rete
« Risposta #9 il: Dicembre 02, 2019, 09:27:14 am »
Ciao Tito
io ho trovato lo stesso problema usando zeos ed ho risolto settando "tiReadCommitted" nel "transacisolationlevel" della ZConnection...spero ti sia utile
Ciauz
« Ultima modifica: Dicembre 02, 2019, 09:29:30 am da Diego1981 »

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Lavorare in rete
« Risposta #10 il: Dicembre 02, 2019, 10:04:07 am »
Diego1981 infatti è quello che ho detto anche io dall'inizio, mi sembra un problema di livello d'isolamento della transazione. Su zeos si sistema come dici tu, ma per quanto riguarda i componenti standard non ho trovato la soluzione. Penso che chiudendo e riaprendo la transazione oltre che la query il problema si risolva.
Ieri è passato, domani è futuro, oggi è un dono...

tito_livio

  • Full Member
  • ***
  • Post: 146
  • Karma: +3/-0
Re:Lavorare in rete
« Risposta #11 il: Dicembre 03, 2019, 12:46:43 pm »
Ciao a tutti, ho trovato una soluzione, il problema si è risolto cambiando il tipo di tabella da InnoDB a MyIsam. MyIsam è molto più veloce ed è il tipo di tabella Mysql che adotto di solito, quindi per me va bene, per chi usa invece InnoDB il problema rimane.

Credo sia un problema di gestione delle transazioni, gestione modificata nelle ultime versioni di Lazarus.
Sempre rimanendo con la tabella di tipo InnoDB, ho provato le soluzioni consigliate, sia qui che sul forum internazionale, ma purtroppo non rivolvono il problema, ecco perché:

1)Chiudere la transazione non funziona, i record rimangono sempre uguali. Inoltre chiudere la transazione implica la chiusura  di tutte le tabelle, quindi non è una soluzione applicabile. In un progetto per un programma di solito ci sono molte tabelle aperte, chiuderle e riaprirle tutte, per aggiornarne solo una, diventa problematico e rallenta il programma.
Da considerare inoltre che il componenente SQLTransaction non ha un metodo "close", io l'ho chiuso così:
 
  attesa.close;
  sqltransaction1.Active:=false;
  sqltransaction1.active:=true;
  attesa.open

2)Distruggere il componente SQLQuery non è praticabile, vanno ridefinite troppe proprietà: database, sql, campi usati, campo indice, eventuali parametri usati, ecc.

3)Usare commit anzichè commitretaining non va bene, perchè commit chiude tutte le tabelle della connessione.

4)L'unica soluzione che non ho provato è quella di Diego1981, dovrei usare Zeos che fino ad adesso non ho usato perchè mi sono trovato benissimo con i componenti standard.

Comunque grazie per l'aiuto.

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Lavorare in rete
« Risposta #12 il: Dicembre 03, 2019, 01:34:20 pm »
A questo punto presumo che sia un bug. Mi sa che va segnalato sul bugtracker di free pascal.
Ieri è passato, domani è futuro, oggi è un dono...

tito_livio

  • Full Member
  • ***
  • Post: 146
  • Karma: +3/-0
Re:Lavorare in rete
« Risposta #13 il: Dicembre 06, 2019, 11:28:30 am »
Il bug lo segnali tu? Vorrei sapere cosa ti rispondono.
Grazie e ciao.

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3249
  • Karma: +12/-0
Re:Lavorare in rete
« Risposta #14 il: Dicembre 07, 2019, 11:27:48 am »
Segnalato: https://bugs.freepascal.org/view.php?id=36404

Speriamo qualcuno risponda velocemente.
Ieri è passato, domani è futuro, oggi è un dono...

 

Recenti

How To

Utenti
  • Utenti in totale: 785
  • Latest: gmax
Stats
  • Post in totale: 18771
  • Topic in totale: 2233
  • Online Today: 427
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 173
Total: 173

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.