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)

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.