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)