Psycopg; How to detect row locking?

Steve Holden steve at holdenweb.com
Mon Sep 27 09:50:37 EDT 2004


Alban Hertroys wrote:

> Jorge Godoy wrote:
> 
>> Are you manually locking those rows?  If so, you can maintain some
>> structure to keep track of locked rows.
> 
> 
> No, I don't. That may be a solution, though. Then at least I *know* when 
> a record is locked... But it's going to complicate things, if the 
> transaction is split among multiple threads... I'm not looking forward 
> to that.
> 
> I think the rows are locked because the inserts haven't finished 
> inserting yet. The select takes place in the same session AFAIK, but not 
> in the same thread of my Python application. I'm probably looking at a 
> race condition here... (Ain't multithreading fun...)
> 
> I'm also not sure whether I'm actually looking at the same transaction. 
> Is there a way to verify such?
> 
If all threads are using the same database connection then you need to 
make sure that psycopg is thread-safe, which some database modules are 
and some aren't.

> I do know for certain that all transactions use the same database 
> connection (I pass it along in a context object, together with config 
> settings and debugging methods). And I'm also quite sure that it doesn't 
> commit in between.
> 
If all threads are using the same database connection, even if you 
create multiple cursors, then you shouldn't have any locking issues 
because all threads are part of the same transaction.

>> If you are not locking, PostgreSQL uses MVCC where it locks as little as
>> possible and you are able to select the new data inside the same
>> transaction and old data outside of it (until it is commited).
> 
> 
> I suppose there must be a short while where the row is locked during the 
> insert, where I may already be trying to select it. If this is indeed 
> the case, I would expect to receive a "row is locked" type of error.
> 
This will perhaps depend on the isolation level you've selected. I'm 
sorry, I'm not a PostgreSQL user so I don't know the detail of what's 
available, but in many databases you can determine whether transactional 
changes are visible from other connections.

> Alternatively, the select may be waiting (w/in psql) until the insert 
> finished (which should be pretty soon in all cases[*]), but that depends 
> on implementations beyond my reach. Not that that matters, I shouldn't 
> have this problem in that case.
> 
> 
> [*] Unless you break your database with triggers that lock up or 
> something similar. That could be a reason for the PostgreSQL team to not 
>  let select wait until an insert on the same row finished, but to return 
> an error instead.

regards
  Steve




More information about the Python-list mailing list