Serializzazione e conseguenze delle transazioni libpqxx
-
21-12-2019 - |
Domanda
Per la mia implementazione, una scrittura particolare deve essere eseguita in blocco e senza possibilità che un'altra interferisca.
sono stato detto che due transazioni concorrenti in questo modo porteranno la prima a bloccare la seconda, e la seconda potrebbe o meno essere completata dopo la prima.
Per favore posta la documentazione che lo conferma.Inoltre, cosa succede esattamente alla seconda transazione se la prima si blocca?Sarà in coda, fallirà o qualche combinazione?
Se ciò non può essere confermato, il livello di isolamento della transazione per questa transazione dovrebbe essere impostato su SERIALIZABLE
?In tal caso, come è possibile farlo con le istruzioni preparate libpqxx?
Se le transazioni sono serializzate, la seconda transazione fallirà o verrà messa in coda fino al completamento della prima?
Se uno dei due fallisce, come può essere rilevato con libpqxx?
Soluzione
L'unico modo per prevenire in modo definitivo gli effetti della concorrenza è LOCK TABLE ... IN ACCESS EXCLUSIVE MODE
ogni tabella che desideri modificare.
Ciò significa che stai davvero facendo solo una cosa alla volta.Porta anche a divertenti problemi con i deadlock se non acquisisci sempre i tuoi lock nello stesso ordine.
Quindi, di solito, ciò che devi fare è capire quali sono esattamente le operazioni che desideri eseguire e come interagiscono.Determinare quali effetti di concorrenza è possibile tollerare e come prevenire quelli che non si possono tollerare.
Questa domanda così com'è è semplicemente troppo ampia per rispondere in modo utile.
Le opzioni includono:
Tavoli esclusivamente con chiusura.(Questo è il unico modo per eseguire subito un upsert su più righe senza problemi di concorrenza in PostgreSQL).Fare attenzione agli aggiornamenti dei blocchi e ai deadlock relativi all'ordine dei blocchi.
uso appropriato di
SERIALIZABLE
isolamento: ma ricorda, devi essere in grado di tenere traccia di ciò che hai fatto durante una transazione e riprovare se la trasmissione si interrompe.Blocco accurato a livello di riga -
SELECT ... FOR UPDATE
,SELECT ... FOR SHARE
."Blocco ottimistico"/controllo ottimistico della concorrenza, ove appropriato
Scrivere le query in modo da renderle più adatte alle operazioni simultanee.Ad esempio, sostituendo i cicli di lettura-modifica-scrittura con aggiornamenti sul posto.