English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
I blocchi sono principalmente per mantenere l'integrità dei dati del database, possono prevenire che l'utente modифицируйте una riga o l'intera tabella, e sono generalmente utilizzati nei database con un alto livello di concorrenza.
Quando più utenti accedono al database contemporaneamente, senza controllo delle operazioni concorrenti, potrebbe verificarsi la lettura e la memorizzazione di dati non corretti, danneggiando l'integrità del database.
Nel database ci sono due tipi di blocchi fondamentali: i blocchi esclusivi (Exclusive Locks) e i blocchi condivisi (Share Locks).
Se viene aggiunto un blocco esclusivo al oggetto di dati, altre transazioni non possono leggerlo e modificarlo.
Se viene aggiunto un blocco condiviso, l'oggetto del database può essere letto da altre transazioni, ma non può essere modificato.
La sintassi di base del comando LOCK è la seguente:
LOCK [ TABLE ] name IN lock_mode
name: il nome della tabella esistente da bloccare (opzionale con qualificatore di schema). Se viene specificato solo prima del nome della tabella, viene bloccata solo quella tabella. Se non viene specificato, viene bloccata la tabella e tutte le sue sottotabelle (se presenti).
lock_mode: il modello di blocco specifica con quale blocco confligge questo blocco. Se non viene specificato un modello di blocco, viene utilizzato il modello di accesso esclusivo con il livello di accesso più limitato. I valori possibili sono: ACCESS SHARE, ROW SHARE, ROW EXCLUSIVE, SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, ACCESS EXCLUSIVE.
Una volta acquisito il blocco, questo resterà per il resto del tempo della transazione corrente. Non c'è un comando per sbloccare la tabella; i blocchi vengono sempre rilasciati alla fine della transazione.
Quando due transazioni si aspettano reciprocamente che l'altra completi la sua operazione, può verificarsi un blocco. Anche se PostgreSQL può rilevarli e terminare con un rollback, il blocco è molto scomodo. Per prevenire che l'applicazione incontri questo problema, assicurati di progettare l'applicazione per bloccare gli oggetti nell'ordine stesso.
PostgreSQL fornisce metodi per creare lock con significato definito dall'applicazione. Questi vengono chiamati lock consultivi. Poiché il sistema non li forza, il loro utilizzo corretto dipende dall'applicazione. Le lock consultive sono molto utili per strategie di locking che non si adattano al modello MVCC.
Ad esempio, un uso comune della lock consultiva è simulare la strategia di locking pessimistico tipica nei sistemi di gestione dei dati "file piatti". Sebbene i flag memorizzati nella tabella possano essere utilizzati per lo stesso scopo, la lock consultiva è più veloce, evita l'espansione della tabella e viene pulita automaticamente dal server alla fine della sessione.
Crea la tabella COMPANY (Scarica il file SQL della tabella COMPANY ),i dati sono come segue:
w3codeboxdb# 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 righe)
L'esempio seguente blocca la tabella COMPANY nel database w3codeboxdb in modalità ACCESS EXCLUSIVE.
La clausola LOCK funziona solo in modalità transazionale.
w3codeboxdb=#BEGIN; LOCK TABLE company1 IN ACCESS EXCLUSIVE MODE;
L'operazione sopra riportata produce i seguenti risultati:
LOCK TABLE
Il messaggio sopra indica che la tabella è bloccata fino alla fine della transazione e per completare la transazione, è necessario annullare o confermare la transazione.