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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top