Visualizzazione dei risultati da 1 a 10 su 14

Hybrid View

  1. #1
    Prima di tutto, se posso permettermi, un consiglio generale: se usi funzionalità di MySQL che non sono troppo comuni (come LOCK TABLE e GET_LOCK(), appunto) leggi molto bene la documentazione, per capire come si usano e quali sono le loro limitazioni. In questo caso ti segnalo che GET_LOCK() è abbastanza intelligente, e il tuo IS_FREE_LOCK() introduce un bug; mentre LOCK TABLE non dovrebbe mai (MAI) essere usato con InnoDB. Per il semplice motivo che usano due logiche diverse, e anche se MySQL fa finta di poterle usare insieme, nella realtà penso che non più di 100 persone in tutto il mondo sappiano che cosa succede. E no, non sto esagerando.

    La soluzione è semplicissima: usa le transazioni. Avvia la transazione in questo modo:

    SET autocommit = 0;
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    START TRANSACTION WITH CONSISTENT SNAPSHOT;

    E alla fine concludi con:

    COMMIT;

    Al momento in cui leggerai la tabella, MySQL metterà un lock, e nessuno potrà inserire nulla finché non avrai finito. Se invece un altro thread avrà già acquisito un lock di questo tipo, questa transazione resterà in attesa e leggerà il valore massimo solo quando l'altra transazione sarà terminata. Quindi, come vedi, non c'è nessun conflitto.
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    287
    Quote Originariamente inviata da in the web Visualizza il messaggio
    Per il semplice motivo che usano due logiche diverse, e anche se MySQL fa finta di poterle usare insieme, nella realtà penso che non più di 100 persone in tutto il mondo sappiano che cosa succede. E no, non sto esagerando.
    Ciao,

    Mi hai incuriosito.

    Puoi spiegarmi cosa succede?

  3. #3
    Utente bannato
    Registrato dal
    Jul 2013
    Messaggi
    290
    Ho provato, ma non riesco a cambiare il livello di isolamente (nota: sto usando l'utente ROOT)

    codice:
    MariaDB [konsorzio]> select @@autocommit;
    +--------------+
    | @@autocommit |
    +--------------+
    |            1 |
    +--------------+
    1 row in set (0.00 sec)
    
    MariaDB [konsorzio]> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
    +-----------------------+-----------------+
    | @@GLOBAL.tx_isolation | @@tx_isolation  |
    +-----------------------+-----------------+
    | REPEATABLE-READ       | REPEATABLE-READ |
    +-----------------------+-----------------+
    1 row in set (0.00 sec)
    
    MariaDB [konsorzio]> set transaction isolation level serializable;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [konsorzio]> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
    +-----------------------+-----------------+
    | @@GLOBAL.tx_isolation | @@tx_isolation  |
    +-----------------------+-----------------+
    | REPEATABLE-READ       | REPEATABLE-READ |
    +-----------------------+-----------------+
    1 row in set (0.00 sec)
    Qui provo a impostare i parametri ma... non cambiano!
    
    MariaDB [konsorzio]> set autocommit=0;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [konsorzio]> set transaction isolation level serializable;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [konsorzio]> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
    +-----------------------+-----------------+
    | @@GLOBAL.tx_isolation | @@tx_isolation  |
    +-----------------------+-----------------+
    | REPEATABLE-READ       | REPEATABLE-READ |
    +-----------------------+-----------------+
    1 row in set (0.00 sec)
    
    MariaDB [konsorzio]>
    Ultima modifica di brancomat; 05-01-2014 a 17:48

  4. #4
    Ciao, queste variabili devi cambiarle a livello di sessione (sia per non influenzare le altre sessioni, sia perché la tua applicazione non dovrebbe usare root). Ma è colpa mia, ho scritto io le istruzioni che dovevi eseguire. Ti scrivo quelle giuste, con la dimostrazione che funziona:

    codice:
    MariaDB [(none)]> SELECT @@session.autocommit, @@session.tx_isolation;
    +----------------------+------------------------+
    | @@session.autocommit | @@session.tx_isolation |
    +----------------------+------------------------+
    |                    1 | REPEATABLE-READ        |
    +----------------------+------------------------+
    1 row in set (0.00 sec)
    
    MariaDB [(none)]> SET @@session.autocommit = 0;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [(none)]> SELECT @@session.autocommit, @@session.tx_isolation;
    +----------------------+------------------------+
    | @@session.autocommit | @@session.tx_isolation |
    +----------------------+------------------------+
    |                    0 | SERIALIZABLE           |
    +----------------------+------------------------+
    1 row in set (0.00 sec)
    PS, anche tu usi MariaDB? Bene!
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

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