Gregory Stark <[EMAIL PROTECTED]> writes: > I'm trying to understand what a soft deadlock is as described by deadlock.c.
> As best I understand if a process, A, is waiting for a lock and is being > blocked only because someone, B, is ahead of it in the queue but hasn't been > granted the conflicting lock we want to jump A ahead of B. No, we only do that if it breaks a deadlock. In your example there is no reason to move process A ahead of B. A more typical situation is like this: Process A: begin; select * from T where ...; -- now A holds AccessShareLock on T Process B: lock table T; -- wants AccessExclusiveLock on T, blocks waiting for A Process A: lock table T; -- blocks behind B? Fairness would normally demand that A queue behind B for the AccessExclusiveLock, but if we do that we have a deadlock. So we spring A ahead of B and let it have the AccessExclusiveLock out of turn. This is just the base case; you can get into similar situations involving more than one lockable object and more than two processes. I believe that the above case is caught by the test in ProcSleep and A will be granted the lock upgrade without blocking at all; but any more-complex situation will only be discovered when someone runs the deadlock checker. regards, tom lane ---------------------------(end of broadcast)--------------------------- TIP 7: You can help support the PostgreSQL project by donating at http://www.postgresql.org/about/donate