Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Accesso concorrente a Mysql

    Salve a tutti, ho questo problema:
    Ho due applicazioni in rete locale che lavorano sulla stessa tabella in Mysql.
    Entrambe appendono circa 500 record al giorno, in media vengono appesi circa 4 record alla volta.
    Pero' l'1% dei record non viene salvato, si perde nel nulla.
    Le tabelle sono di tipo MyIsam, non posso usare quelle di tipo InnoDB.
    Io sviluppo in Delphi ed in Lazarus e mi succede con entrambi.
    Metto qui di seguito un esempio del codice usato:

    table1.open;
    while ... do
    begin
    table1.AppendRecord([...]);
    .
    .
    table1.ApplyUpdates(4);
    database1.Transaction.CommitRetaining;
    end;
    table1.close;

    Aggiungo che la cosa non succede se ad accedere e' una sola applicazione. Cioe' se non c'e' l'accesso concorrente. Per vari motivi non posso bloccare la tabella.
    Ho provato anche ad impostare la variabile Mysql concurrent_insert=2 (prima aveva il valore di default, 1).

    Se il codice fosse sbagliato, dovrei avere degli errori o non si dovrebbe salvare nulla, cosa puo' essere secondo voi?
    Ultima modifica di tito_livio; 19-05-2021 a 15:55

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,194
    Non sono ferratissimo su Delphi, ma hai verificato se vengono sollevate eccezioni? E' difficile che dei record vengano "buttati via" senza che vi sia una causa... e, generalmente, quando questo accade viene sollevata un'eccezione. Solitamente, quindi, si inizia una transazione, si effettuano le INSERT, alla fine si effettua un COMMIT. Se qualcosa va storto viene sollevata un'eccezione e in quel caso si esegue una ROLLBACK.

    Se viene sollevata un'eccezione dovresti fare due cose:

    1) Vedere qual è l'errore sollevato (solitamente l'eccezione si porta dietro un messaggio, un error code, uno stack trace, qualcosa che faccia capire la natura del problema e la causa).

    2) Ritentare l'operazione (almeno una volta).
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Grazie LeleFT per la risposta,
    non si sono mai verificate eccezioni. Poi il rollback non credo sia possibile, in quanto la tabella è di tipo MyIsam e questo tipo di tabella non supporta le transazioni. In ogni caso l'istruzione ApplyUpdates ha come argomento 4, cioè in caso qualcosa andasse storto riprova fino a 4 volte. Questo fatto di riprovare 4 volte è stato comunque aggiunto in un secondo momento per cercare di evitare il problema del mancato salvataggio.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2021 vBulletin Solutions, Inc. All rights reserved.