GET_LOCK
Sintassi
GET_LOCK(str, timeout)
Spiegazione
Cerca di acquisire un lock con il nome specificato nella stringa str, che scade dopo timeout secondi. Restituisce 1 se il lock viene acquisito con successo, 0 se il timeout scade (per esempio, perché un altro client ha prenotato quel nome in precedenza), o NULL se si verifica un errore (ad esempio se la memoria si esaurisce o il thread viene terminato con mysqladmin kill). I lock ottenuti con GET_LOCK() possono essere rilasciati eseguendo RELEASE_LOCK(), eseguendo un nuovo GET_LOCK() o al termine della connessione (sia che avvenga normalmente, sia che avvenga un arresto anomalo). I lock acquisiti con GET_LOCK() non interagiscono con le transazioni. I commit quindi non rilasciano i lock di questo tipo, anche se sono stati acquisiti durante la transazione corrente.
MariaDB starting with 10.0.2
Kostja Osipov
ha contribuito con una patch (MDEV-3917) che permette di impostare più lock in una sola connessione tramite GET_LOCK(). Se viene rilevato un deadlock, GET_LOCK() restituisce un errore.
str non è case sensitive in GET_LOCK() e nelle funzioni correlate, cioè non c'è differenza tra le lettere minuscole e le maiuscole. Se str è una stringa vuota o NULL, GET_LOCK() restituisce NULL e non fa nulla.
Questa funzione può essere utilizzata per implementare i lock a livello di applicazione o per simulare i lock a livello di record. I nomi sono bloccati nell'intero server. Se un nome è prenotato da un client, GET_LOCK() blocca tutte le richieste degli altri client che utilizzano lo stesso nome. In questo modo i client che convengono sull'utilizzo di certi nomi di lock possono effettuare un locking cooperativo. Ma occorre ricordare che ciò permette anche ai client prenotare un nome, inavvertitamente o deliberatamente, impedendo così agli altri client di prenotarlo. Un modo per ridurre questo rischio è utilizzare nomi di lock specifici del database, o dell'applicazione. Per esempio, usando nomi nella forma nome_db.str o nome_app.str.
Esempi:
MariaDB [test]> SELECT GET_LOCK('lock1',10)\G
*************************** 1. row ***************************
GET_LOCK('lock1',10): 1
1 row in set (0.00 sec)
MariaDB [test]> SELECT IS_FREE_LOCK('lock2')\G
*************************** 1. row ***************************
IS_FREE_LOCK('lock2'): 1
1 row in set (0.01 sec)
MariaDB [test]> SELECT GET_LOCK('lock2',10)\G
*************************** 1. row ***************************
GET_LOCK('lock2',10): 1
1 row in set (0.00 sec)
MariaDB [test]> SELECT RELEASE_LOCK('lock2')\G
*************************** 1. row ***************************
RELEASE_LOCK('lock2'): 1
1 row in set (0.00 sec)
MariaDB [test]> SELECT RELEASE_LOCK('lock1')\G
*************************** 1. row ***************************
RELEASE_LOCK('lock1'): NULL
1 row in set (0.00 sec)