Discussione:
Locking di tabelle in lettura/scrittura su Postgres
(troppo vecchio per rispondere)
Alessandro Pellizzari
2010-09-30 12:46:10 UTC
Permalink
Salve,

per un sito che sto sviluppando ho bisogno di bloccare qualsiasi lettura
e scrittura concorrente su tre tabelle di un database postgres.

In pratica devo leggere due valori da due tabelle. Se un flag segna
"libero", uso quei due valori, li scrivo in una terza tabella, e poi
aggiorno le altre due dicendo che ora sono "occupati" (e quindi non piu`
utilizzabili).

Sono una specie di "one time password".

Devo evitare che un secondo processo vada a leggere quelle due tabelle
prima che io abbia potuto scriverci "occupato", e quindi possa usare gli
stessi codici.

Leggendo il manuale mi pare di aver capito che una cosa del genere si
puo`
fare solo dentro una transazione, e che al termine della transazione il
lock viene rilasciato automaticamente.

Per ora ho fatto cosi`:

begin transaction;
lock table tab1, tab2, tab3;
select * from tab1 where...;
select * from tab2 where...;
insert into tab3 ...;
update tab1 set...;
update tab2 set...;
commit;

E` corretto?

Nel frattempo sto scrivendo dei test, ma con le cose concorrenti non si
e` mai sicuri di niente, quindi mi piacerebbe avere un parere da qualcuno
che ci e` gia` passato.

Grazie mille.
Bye.
The man with two watches
2010-10-02 08:27:48 UTC
Permalink
"Alessandro Pellizzari"
Post by Alessandro Pellizzari
Salve,
per un sito che sto sviluppando ho bisogno di bloccare qualsiasi
lettura e scrittura concorrente su tre tabelle di un database
postgres.
[...]
Leggendo il manuale mi pare di aver capito che una cosa del genere
si puo` fare solo dentro una transazione, e che al termine della
transazione il lock viene rilasciato automaticamente.
I lock vengono acquisiti e rilasciati automaticamente dal dbms,
non c'e` bisogno di specificarli a mano; oltretutto analizzando
i comandi SQL, e combinandoli con la struttura del database e con
le statistiche di popolamento delle tabelle, e` probabile che il
dbms faccia un lavoro migliore di quanto fattibile a mano: proviamo
solo a pensare all'escalation in corso d'opera della granularita'
dei lock, qualcosa che sarebbe praticamente impossibile fare a mano.

Inoltre il dbms determina anche la granularita` piu' appropriata
del bloccaggio: in questo caso il blocco a livello di tabella e`
esagerato, basta un blocco a livello di riga.
Devi solo scegliere il livello di isolamento appropriato; se non
sei sicuro, scegli il livello piu' alto.
Post by Alessandro Pellizzari
Nel frattempo sto scrivendo dei test, ma con le cose concorrenti
non si e` mai sicuri di niente, quindi mi piacerebbe avere un
parere da qualcuno che ci e` gia` passato.
La concorrenza e` un argomento enorme; vedi di sfruttare tutto
quello che il DBMS ha da offrire, innanzitutto; di solito svolge
bene il proprio lavoro.

Loading...