Osvaldo Kussama escreveu:
> 2009/12/18 Clayton Graf <[email protected]>:
>> Pessoal, estou tendo um problema e gostaria de saber como vocês fazem para
>> contornar a situação.
>> Quando faço um SELECT o pgsql gera um lock na tabela (AccessShareLock). Se
>> logo após faço um ALTER TABLE na mesma tabela este comando não é executado
>> devido ao LOCK gerado pelo SELECT.
>> Na prática isto significa que somente posso alterar a estrutura do banco
>> quando não tiver nenhum usuário conectado, o que dificulta as coisas.
>> É assim mesmo? Como vocês fazem? Tem como não gerar o lock "AccessShareLock"
>> após o select?
>
Não. Você certamente está deixando transações abertas antes de executar o
ALTER TABLE. Veja:
sessão A:
euler=# begin;
BEGIN
euler=# select * from aa;
a | b
---+---
(0 rows)
sessão B:
euler=# begin;
BEGIN
euler=# alter table aa add column c integer; -- não retorna até conseguir lock
LOG: process 4920 still waiting for AccessExclusiveLock on relation 73841 of
database 16384 after 1000.230 ms
sessão C:
euler=# select relation,relation::regclass,pid,mode,granted from pg_locks;
relation | relation | pid | mode | granted
----------+----------+-------+---------------------+---------
73841 | aa | 4920 | AccessExclusiveLock | f
| | 4920 | ExclusiveLock | t
10969 | pg_locks | 15405 | AccessShareLock | t
73841 | aa | 15319 | AccessShareLock | t
| | 15319 | ExclusiveLock | t
| | 15405 | ExclusiveLock | t
(6 rows)
Veja que a primeira linha mostra que há um travamento que não foi adquirido
ainda (granted = 'f'). Logo abaixo descobrimos o processo 15319 com travamento
adiquirido que está bloqueando a transação que contém o ALTER TABLE.
sessão A:
euler=# rollback; -- depois desse comando o ALTER TABLE é executado
ROLLBACK
sessão B:
LOG: process 4920 acquired AccessExclusiveLock on relation 73841 of database
16384 after 253610.896 ms
ALTER TABLE
euler=#
> Certamente você não está executando um SELECT simples mas sim um
> SELECT com a cláusula FOR SHARE [1].
>
Não necessariamente.
Vale ressaltar que _somente_ o AccessExclusiveLock conflita com o
AccessShareLock [1].
[1] http://www.postgresql.org/docs/8.4/static/explicit-locking.html
--
Euler Taveira de Oliveira
http://www.timbira.com/
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral