Search Postgresql Archives

Re: Table modifications with dependent views - best practices?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Apr 23, 2005 at 10:36:00AM -0500, Thomas F.O'Connell wrote:
>
> Why would DDL statements in a transaction cause deadlocks? I understand 
> the prevention of concurrent access, but I'm curious to know more about 
> how deadlocks arise in this situation, as this is something I've seen 
> in a production environment during transactional DDL traffic. Why would 
> DDL statements be more likely to cause lock acquisition at cross 
> purposes?

Locks are held until transaction end, as can be observed by querying
pg_locks.  DDL statements typically acquire an AccessExclusiveLock,
which conflicts with all other lock types.  With those in mind,
consider the following example:

Setup:

  CREATE TABLE foo (a integer);
  CREATE TABLE bar (x integer);

Transactions:

  T1: BEGIN;
  T2: BEGIN;

  T1: SELECT * FROM foo;
  T2: ALTER TABLE bar ADD COLUMN y integer;

T1 now has an AccessShareLock on foo, and T2 has an AccessExclusiveLock
on bar.

  T1: SELECT * FROM bar;
  T2: ALTER TABLE foo ADD COLUMN b integer;

T1's SELECT blocks because it wants a lock that conflicts with T2's
lock on bar, and T2's ALTER blocks because it wants a lock that
conflicts with T1's lock on foo.  Both transactions are waiting for
the other to release a lock, so we get deadlock.

-- 
Michael Fuhr
http://www.fuhr.org/~mfuhr/

---------------------------(end of broadcast)---------------------------
TIP 7: don't forget to increase your free space map settings

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux