Visualizzazione dei risultati da 1 a 2 su 2

Discussione: [PYTHON] Leggere valore aggiornato da MySQL da più thread

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,205

    [PYTHON] Leggere valore aggiornato da MySQL da più thread

    File 1)
    codice:
    Thread(target=genMenu).start()
    
    def genMenu():
        conn = MariaDB()
        conn.main()
    
        while True:
            conn.exec("""
                SELECT 1
                  FROM `tableMenu`
                 WHERE `hwnd` = '%(hwnd)s'
                 LIMIT 1
            """, {"hwnd", hwnd})
    
            print(conn.count())
    
            sleep(2)
    File 2)
    codice:
    conn.exec(
        "REPLACE INTO `tableMenu` VALUES ('%(hwnd)s')",
        {"hwnd", hwnd}
    )
    Funzioni database:
    https://pastebin.com/ub5NZdA4


    Ho due file, uno che inserisce un valore, il secondo che dovrebbe estrarrlo, ma non lo fa...

    Ho cercato e su stackoverflow ho letto che ogni thread deve avere la sua connessione e qualche errore è stato risolto (prima non leggeva neanche i risultati che aggiornava dal suo stesso thread).

    Il valore viene inserito correttamente perchè controllo su MariaDB, però non viene letto, ho pensato che potrei chiudere/aprire la connessione ad ogni query, però non mi sembra la soluzione ottimale e non so neanche se potrebbe funzionare...

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,205
    Da un altro forum...
    @riko
    Allora, con l'esempio minimale, chiarissimo, un sospetto mi e' venuto.

    Questo apparentemente sembra un classico problema di data isolation. Ovvero, chi legge non trova il dato che tu ti saresti aspettato che trovasse.
    Il motivo e' che tipicamente per essere completamente ACID si paga un costo elevato. Quindi la maggior parte dei DB di fatto usano livelli di isolation piu' bassi che normalmente funzionano molto bene, ma quando vai a controllare nello specifico si manifestano grosso modo in questo modo. Il fatto che riaprendo la connessione il problema si risolve e' consistente con questo: riaprendo la connessione di fatto vedi l'ultimo stato salvato, inclusa la modifica.

    Ora io non posso essere davvero che sia questo. Puoi cambiare i parametri di isolation per forzare il massimo e a quel punto dovrebbe funzionare tutto.

    Un altra possibilita' e' che semplicemente le operazioni invocate non vengono completate prima che l'altro legga. Nel senso che tu stai guardando i log da Python, quindi vedi quello che ti dice il db, non quello che fa il DB. E' interamente possibile che quando fai session execute per scrivere tu debba in qualche modo fare commit (implicito alla chiusura). Essenzialmente questo e' vero anche nel caso in cui ci sono transazioni. Molti db invocano di default (oppure perche' configurati cosi') i comandi che gli dai dentro una transazione implicita, quindi devi committare la transazione (molti db hanno il comando COMMIT). Quando chiudi la connessione, la transazione e' automaticamente committata (o rollbackata se in errore). Si, ovviamente in questo caso sei comunque legato alla questione isolation... sarebbe una lunga discussione, ma le transazioni sono uno strumento prezioso nel campo della data isolation.

    Non ho voglia di andare a vedere la documentazione di Maria DB, questi sono problemi che ho visto con altri db che si manifestano in modo simile. Hai anche abbastanza informazione per ingegnarti e capire come determinare se e' una delle due (che so... o leggendo la documentazione con quest'ottica in mente oppure facendo esperimenti -- no, provare a tirare comandi a caso non conta come esperimento... anche se e' possibile che aggiungendo COMMIT nel posto giusto risolvi davvero).

    Esatto.

    Ho letto io la documentazione per te, e MariaDB effettua le SELECT in modalità UNCOMMITED.

    Tanto di cappello, si risolve sia:
    SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

    Da root o committando dopo la query.

    I miei complimenti.

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 © 2017 vBulletin Solutions, Inc. All rights reserved.