PostgreSQL - BLOCCHI

Serrature o esclusivo serrature o serrature scrittura impedire agli utenti di modificare una riga o un'intera tabella. Le righe modificate da UPDATE e DELETE vengono quindi bloccate automaticamente in modo esclusivo per la durata della transazione. Ciò impedisce ad altri utenti di modificare la riga fino a quando non viene eseguito il commit o il rollback della transazione.

L'unico momento in cui gli utenti devono attendere altri utenti è quando tentano di modificare la stessa riga. Se modificano righe diverse, non è necessaria alcuna attesa. Le query SELECT non devono mai aspettare.

Il database esegue il blocco automaticamente. In alcuni casi, tuttavia, il blocco deve essere controllato manualmente. Il blocco manuale può essere eseguito utilizzando il comando LOCK. Consente la specifica del tipo di blocco e dell'ambito di una transazione.

Sintassi per il comando LOCK

La sintassi di base per il comando LOCK è la seguente:

LOCK [ TABLE ]
name
 IN
lock_mode
  • name- Il nome (facoltativamente qualificato dallo schema) di una tabella esistente da bloccare. Se viene specificato SOLO prima del nome della tabella, solo quella tabella è bloccata. Se SOLO non è specificato, la tabella e tutte le sue tabelle discendenti (se presenti) vengono bloccate.

  • lock_mode- La modalità di blocco specifica con quali blocchi questo blocco è in conflitto. Se non viene specificata alcuna modalità di blocco, viene utilizzata ACCESS EXCLUSIVE, la modalità più restrittiva. I valori possibili sono: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE.

Una volta ottenuto, il blocco viene mantenuto per il resto della transazione corrente. Non è presente alcun comando UNLOCK TABLE; i blocchi vengono sempre rilasciati alla fine della transazione.

DeadLocks

I deadlock possono verificarsi quando due transazioni sono in attesa l'una dell'altra per completare le proprie operazioni. Sebbene PostgreSQL possa rilevarli e terminarli con un ROLLBACK, i deadlock possono comunque essere scomodi. Per evitare che le tue applicazioni incontrino questo problema, assicurati di progettarle in modo tale che blocchino gli oggetti nello stesso ordine.

Serrature consultive

PostgreSQL fornisce i mezzi per creare blocchi con significati definiti dall'applicazione. Questi sono chiamati blocchi di avviso . Poiché il sistema non ne impone l'uso, spetta all'applicazione utilizzarli correttamente. I blocchi di avviso possono essere utili per le strategie di blocco che sono una scelta scomoda per il modello MVCC.

Ad esempio, un uso comune dei blocchi di avviso è quello di emulare strategie di blocco pessimistiche tipiche dei cosiddetti sistemi di gestione dei dati "flat file". Sebbene un flag memorizzato in una tabella possa essere utilizzato per lo stesso scopo, i blocchi di avviso sono più veloci, evitano il gonfiaggio della tabella e vengono automaticamente ripuliti dal server alla fine della sessione.

Esempio

Considera che la tabella AZIENDA ha i record come segue:

testdb# select * from COMPANY;
 id | name  | age | address   | salary
----+-------+-----+-----------+--------
  1 | Paul  |  32 | California|  20000
  2 | Allen |  25 | Texas     |  15000
  3 | Teddy |  23 | Norway    |  20000
  4 | Mark  |  25 | Rich-Mond |  65000
  5 | David |  27 | Texas     |  85000
  6 | Kim   |  22 | South-Hall|  45000
  7 | James |  24 | Houston   |  10000
(7 rows)

L'esempio seguente blocca la tabella COMPANY all'interno del database testdb in modalità ACCESS EXCLUSIVE. L'istruzione LOCK funziona solo in modalità transazione -

testdb=#BEGIN;
LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;

L'istruzione PostgreSQL sopra indicata produrrà il seguente risultato:

LOCK TABLE

Il messaggio sopra indica che la tabella è bloccata fino al termine della transazione e per terminare la transazione dovrai eseguire il rollback o il commit della transazione.