Alessandro Pellizzari
2010-09-30 12:46:10 UTC
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.
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.