>> 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

E era disso que eu estava falando.

>> 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

statement_timeout não é "estouro do tempo de transação".
Pode ser traduzido livremente como "estouro do tempo de consulta",
como o próprio link indicado explica. Transações não tem timeout
definido no PostgreSQL e, por isso, transações não finalizadas ficam
no estado "idle <in transaction>", uma das coisas que  sua função pode
fazer, o que é péssimo. Sem contar que você pode colocar uma conexão
como "blocked".

> 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,

É perfeitamente possível implementar uma aplicação usando sequências
sem pular números.
Imagine um emissor de notas fiscais, sequenciais, num POS. É uma
conexão com o banco, uma aplicação single thread, não haverá "pulo".

Numa aplicação distribuída, não havendo ROLLBACK, não haverá "pulo"
também. E se, alguém fizer o ROLLBACK, pode-se ter uma sub-rotina de
contorno que vai colocar o valor inutilizado da sequência numa tabela
pool.

[]s
Flavio Gurgel
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a