La maggior parte degli RDBMS consente di acquisire una condivisione sul blocco esclusivo sulle righe selezionate. Ad esempio, PostgreSQL ha una sintassi del genere:Perché i blocchi dei predicati non possono essere acquisiti tramite una sintassi esplicita della query di blocco
SELECT *
FROM post
WHERE id=10
FOR SHARE;
Utilizzando PER SHARE, si può acquisire blocchi condivisa anche in livello di isolamento READ_COMMITTED e fenomeni di lettura non ripetibili può essere impedito senza utilizzare l'isolamento della transazione REPEATABLE_READ.
Ma per evitare letture fantasma, SERIALIZABLE è l'unico modo per farlo. Perché non esiste una sintassi di blocco esplicita per acquisire anche un blocco di predicati?
A mia conoscenza, non ricordo di aver visto alcun costrutto simile in Oracle, SQL Server, MySQL o PostgreSQL.
come ricordo per SHARE ha lo stesso semantico di SELECT FOR UPDATE. si riceve READ LOCK per la lettura su tutte le tabelle coinvolte per la selezione. d'altra parte, SERIALIZABLE lvl fornisce anche WRITE LOCK. inoltre, SELECT FOR UPDATE ha la stessa semantica in Oracle, ad es. – ivanenok
PER SHARE acquisisce un blocco di lettura, mentre FOR UPDATE fornisce invece un blocco di scrittura. Quando si utilizza SERIALIZABLE, il database acquisisce entrambi i blocchi SHARED (per impedire le letture fuzzy) su tutte le righe recuperate e anche i blocchi intervallo/predicato (per evitare letture fantasma). –
Perché si desidera imporre un livello di isolamento della transazione a ogni query anziché utilizzare solo il livello di isolamento della transazione? In Oracle, è possibile utilizzare sempre una query di flashback su un SCN per evitare letture fantasma (che è ciò che Oracle sta facendo sotto le copertine se si imposta il livello di isolamento della transazione su serializzabile). Ciò non richiederebbe alcun tipo di blocco o alcun tipo di blocco di altre sessioni. Ma non avrebbe lo stesso comportamento di lanciare un ORA-08177: Impossibile serializzare l'accesso per questo errore di transazione per modifiche non serializzabili. –