From: | Jon Swinth <jswinth(at)atomicpc(dot)com> |
---|---|
To: | Stephan Szabo <sszabo(at)megazone23(dot)bigpanda(dot)com> |
Cc: | <pgsql-general(at)postgresql(dot)org> |
Subject: | Re: Fix FK deadlock, but no magic please |
Date: | 2003-01-17 23:25:48 |
Message-ID: | 200301171525.48793.jswinth@atomicpc.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
Oracle's behavior AFAIK depends on which lock you are talking about. If you
are talking about not being able to get a read lock then Oracle just blocks
until it can, indefinately unless a deadlock is detected.
If you are talking about a write lock, that depends on how the write lock is
called. If you call SELECT ... FOR UPDATE or call UPDATE/DELETE without
locking first then again Oracle will block until it can get the lock. If you
call SELECT ... FOR UPDATE NOWAIT then Oracle will throw a specific SQL
exception if a lock cannot be granted immediately. This allows you to do a
sleep and retry in your code so that you only wait for a lock so long:
boolean locked = false ;
int retryCount = 3 ;
while (!locked) {
try {
SELECT 1 FROM some_table WHERE some_condition FOR UPDATE NOWAIT ;
} catch (SQLException e) {
if (retryCount > 0) {
retryCount += 1 ;
sleep(1);
} else {
throw e ;
} //end if
} //end try
} //end while
With this kind of logic you can control how long you wait for a lock. If some
idiot did something that locked a whole bunch of records, you don't want the
entire DB to come to a stop waiting to get a lock. That type of thing can't
be caught by deadlock detection since the idiot isn't trying to lock anything
else.
Unfortunately, this is not possible in PostgreSQL even if you added the NOWAIT
functionality (yet?). Thats because the first SQL Exception thrown
automatically voids the transaction and you are forced to roll back. It
doesn't matter that your code knows how to get around the exception.
PostgreSQL requires that you call rollback and start over. It is actually
kind of funny. When I first came across this it was the first time in my
life that I had ever seen a SQL exception on a sequence select (caused by a
SQL Exception just before the select).
On Friday 17 January 2003 10:09 am, Stephan Szabo wrote:
> On Fri, 17 Jan 2003, Jon Swinth wrote:
> > Now, if we could only have the feature like Oracle of SELECT ... FOR
> > UPDATE NOWAIT, so I can control how long we wait for a lock. Wait...
> > can't do that until SQL exceptions stop voiding the transaction (I want
> > to be able to retry the lock several times before giving up).
>
> What's Oracle's behavior when some of the rows can be locked and some
> can't?
From | Date | Subject | |
---|---|---|---|
Next Message | Stephan Szabo | 2003-01-17 23:34:18 | Re: Fix FK deadlock, but no magic please |
Previous Message | Tom Lane | 2003-01-17 23:23:10 | Re: pg_stat_get_backen_last_activity() ??? |