Em 3 de março de 2011 23:07, Flavio Henrique Araque Gurgel
<fha...@gmail.com> escreveu:
> Sinto muito, mas essa implementação pode ter um efeito colateral. Duas
> transações concorrentes podem "catar" o mesmo valor. O SELECT... FOR
> UPDATE não impede a leitura do registro.

Impedem sim. Se usados corretamente. O valor do contador deve ser
obtido através de um único meio para que o FOR UPDATE funcione, como o
uso de uma função com citei no exemplo. Só não impede que um outro
SELECT *sem* a cláusula FOR UPDATE leia o mesmo registro. O uso deste
recurso requer conhecimento dos níveis de isolação de bancos de dados
[1] para entender que este comando faz uma *reserva* do registro
aplicando um tipo de LOCK que é diferente do tipo obtido por um
simples SELECT, sendo que os dois não são conflitantes.


> Pode ocorrer um ROLLBACK automático na transação que chegar por último
> na hora fizer o UPDATE da sua função. Se a aplicação não tratar esse
> ROLLBACK (e tentar novamente até conseguir sucesso no COMMIT) isso
> pode se tornar uma bola de neve e um catastrófico "lock geral" numa
> aplicação com muita concorrência.
>

Pode ocorrer o estouro de tempo de transação se a variável
STATEMENT_TIMEOUT estiver configurada com um valor diferente de zero
[2], mas isso certamente apresentaria um erro no client que deve ser
devidamente tratado como qualquer comando SQL executado no banco de
dados. Quanto à "bola de neve" eu acredito que isto poderia ser
tratado com um simples ROLLBACK quando ocorrer um erro na execução de
qualquer comando da pilha da aplicação, incluindo erros por timeout.
Na minha concepção, aplicações que não fazem isso e mantém o LOCK
sobre os registros são mal implementadas.


> A implementação de sequências foi inventada exatamente pra isso, sem
> dor de cabeça. Não acho legal tentar contornar por fora algo que um
> banco de dados sério sabe fazer com maestria.
>

Nos quesitos facilidade de implementação e desempenho, as sequencias
são imbatíveis. Eu mesmo tenho experiências práticas com isso. Mas
reforço que para alguns casos quando os contadores precisam seguir uma
sequência infalível, ou seja, sem *pular* um único valor, usar uma
SEQUENCE não é o mais indicado. E por falar em bancos de dados sério,
outros SGBDs pagos e sérios também tem esta opção e funcionam com toda
a maestria que lhes compete implementar os níveis de isolação.


[1] http://www.postgresql.org/docs/9.0/static/transaction-iso.html
[2] http://www.postgresql.org/docs/9.0/static/runtime-config-client.html

-- 
TIAGO J. ADAMI
http://www.adamiworks.com
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a