Re: [sqlalchemy] Exclusive SELECT?

2011-06-01 Thread A.M.

On Jun 1, 2011, at 12:56 AM, thatsanicehatyouh...@mac.com wrote:

 Hi,
 
 I'm working on a script using SQLAlchemy against a PostgreSQL database and 
 using Python's multiprocessing. The pattern is for each thread to:
 
 - start a transaction (session.begin())
 - retrieve the next row in table X that has not yet been processed
 - set a being_processed flag in the row so no other query will return it
 - close the transaction (session.commit())
 
 The rest of the thread then performs the work, saves the results back, and 
 cleans up. This is all working well except for one thing - multiple threads 
 are retrieving the same row. My first solution was to pull the work above 
 into the main thread, but this won't work as I'd like to run this same script 
 on *multiple* machines - the database needs to be the gatekeeper.
 
 Does anyone have any suggestions on how I can make a database-wide exclusive 
 transaction through SQLAlchemy (or otherwise!)? I'm using SQLAlchemy 0.6.7.

Hi Demitri,

The problem is that the flag is set in a transaction A, so transaction B is not 
able to see the change in state until A is committed (in read-committed mode, 
the default), thus creating a race condition. You need to lock the table or use 
another form of synchronization to make sure every connection sees a 
synchronized view of the table.

http://www.postgresql.org/docs/9.0/interactive/sql-lock.html
http://www.postgresql.org/docs/9.0/interactive/sql-select.html#SQL-FOR-UPDATE-SHARE

Cheers,
M

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.



Re: [sqlalchemy] Exclusive SELECT?

2011-06-01 Thread thatsanicehatyouhave
Hi M,

Thanks very much for your help. Adding .with_lockmode('update') to my 
session.query statement worked like a charm!

Now I just need to figure out how to catch exceptions that occur in the work 
unit in the thread, but that's a topic for another list...

Cheers,
Demitri

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.



[sqlalchemy] Exclusive SELECT?

2011-05-31 Thread thatsanicehatyouhave
Hi,

I'm working on a script using SQLAlchemy against a PostgreSQL database and 
using Python's multiprocessing. The pattern is for each thread to:

- start a transaction (session.begin())
- retrieve the next row in table X that has not yet been processed
- set a being_processed flag in the row so no other query will return it
- close the transaction (session.commit())

The rest of the thread then performs the work, saves the results back, and 
cleans up. This is all working well except for one thing - multiple threads are 
retrieving the same row. My first solution was to pull the work above into the 
main thread, but this won't work as I'd like to run this same script on 
*multiple* machines - the database needs to be the gatekeeper.

Does anyone have any suggestions on how I can make a database-wide exclusive 
transaction through SQLAlchemy (or otherwise!)? I'm using SQLAlchemy 0.6.7.

Cheers,
Demitri

-- 
You received this message because you are subscribed to the Google Groups 
sqlalchemy group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.