Hi,

 

In trying to setup a test for a LOCK 'table' algorithm I attempt to execute
two transactions where the first one issues a pg_sleep(10) while 'table' is
locked and the second one attempts LOCK 'table' during the time when the
pg_sleep is executing.  When pg_sleep() returns in the first transaction the
subsequent statement is not executed.  Meanwhile, the second transaction
continues to wait for the lock.  Thus, a deadlock has occurred.  I am doing
my testing within PostGreSQL Maestro running as a "script" and issuing BEGIN
and COMMIT statements around the desired transaction commands.

 

I would expect the first transaction to finish following the 10 second sleep
at which point the first transaction would be able to start.

 

PostgreSQL 9.0.3 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.4.real
(Ubuntu 4.4.3-4ubuntu5) 4.4.3, 64-bit

 

Either script run alone works just fine - it is just when run in tandem as
described is neither able to complete.

 

What am I doing/understanding incorrectly or is this undesirable behavior?

 

Thanks,

 

David J.

 

===============================

--Transaction 1

begin;

 

delete from locktest;

 

LOCK locktest;

 

INSERT INTO locktest (scope, value) VALUES ('TEST','1');

INSERT INTO locktest (scope, value) VALUES ('TEST','2');

 

select pg_sleep(10);

 

rollback; --or commit [This doesn't execute if I begin transaction 2]

>>pg_stat_activity

<IDLE> in transaction

==============================

--Transaction 2

begin;

 

LOCK locktest; --[This never completes if executed during pg_sleep(10)]

 

INSERT INTO locktest (scope, value) VALUES ('TEST','3');

 

commit;

>>pg_stat_activity

LOCK locktest

===============================

 

>>Attempt at pg_lock results; executed AFTER the 10 second pg_sleep
returned.

locktype               database             relation                page
tuple     virtualxid             transactionid      classid   objid
objsubid                virtualtransaction             pid          mode
granted

transactionid
101091                                                  15/359  13752
ExclusiveLock     True

relation                623943  853698
15/359  13752    RowExclusiveLock                True

relation                623943  853698
15/359  13752    AccessExclusiveLock                True

relation                623943  10985
18/153  13770    AccessShareLock                True

relation                623943  853696
15/359  13752    AccessShareLock                True

virtualxid
18/153
18/153  13770    ExclusiveLock     True

virtualxid
15/359
15/359  13752    ExclusiveLock     True

relation                623943  853702
15/359  13752    RowExclusiveLock                True

virtualxid
17/438
17/438  13754    ExclusiveLock     True

relation                623943  853698
17/438  13754    AccessExclusiveLock                False

Reply via email to