Fórum Como posso dar Lock em uma row? #26705
02/04/2007
0
Olá!
Preciso que o Postgresql de alguma forma controle para mim o seguinte:
- se der um select de 1 chave, as linhas retornadas não poderão sofrer update ou delete por outro usuário, a não ser que o usuário que deu select nelas dê update ou delete nestas chaves.
Pelo que já li existe o comando LOCK que é usado dentro de uma TRANSACTION mas ainda não echerguei muito bem se com isso dá para fazer o que preciso.
Alguém tem alguma idéia?
Preciso que o Postgresql de alguma forma controle para mim o seguinte:
- se der um select de 1 chave, as linhas retornadas não poderão sofrer update ou delete por outro usuário, a não ser que o usuário que deu select nelas dê update ou delete nestas chaves.
Pelo que já li existe o comando LOCK que é usado dentro de uma TRANSACTION mas ainda não echerguei muito bem se com isso dá para fazer o que preciso.
Alguém tem alguma idéia?
Iazzetti
Curtir tópico
+ 0
Responder
Posts
23/04/2007
Iazzetti
Consegui, usando o comando
dentro de uma transação, ex:
se tentarmos em outra conexão com o mesmo banco dar UPDATE na(s) linha(s) retornadas por aquele select, Ex:
o update ficaria preso até o COMMIT da transação com o select ser executado.
E se fizermos o select com [b:f60ad703af]NOWAIT[/b:f60ad703af] no final:
e tentarmos um:
em outra conexão com o mesmo banco, o resultado agora seria um erro no banco.
SELECT * FROM compels.teste WHERE a0 = ´1´ FOR UPDATE;
dentro de uma transação, ex:
BEGIN; SELECT * FROM compels.teste WHERE a0 = ´1´ FOR UPDATE; . . . COMMIT;
se tentarmos em outra conexão com o mesmo banco dar UPDATE na(s) linha(s) retornadas por aquele select, Ex:
UPDATE compels.teste SET a1 = ´teste2´ WHERE id = ´1´;
o update ficaria preso até o COMMIT da transação com o select ser executado.
E se fizermos o select com [b:f60ad703af]NOWAIT[/b:f60ad703af] no final:
BEGIN; SELECT * FROM compels.teste WHERE id = ´1´ FOR UPDATE NOWAIT; . . . COMMIT;
e tentarmos um:
UPDATE compels.teste SET a1 = ´teste2´ WHERE id = ´1´;
em outra conexão com o mesmo banco, o resultado agora seria um erro no banco.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)