I have multiple processes accessing  a table. All of these processes
want to read a set of rows from the table, and if the rows are not
present they will make a calculation and insert the rows themselves.
The issue comes where process  A does a query to see if the target set
of rows is present in the table, and they're not, and then another
starts calculating. While it's calculating, process B inserts the
rows. Then process A inserts the rows, and now we have two copies of
these sets of rows. Bad.

The current solution is to have a process:
1. Lock the table with session.execute("LOCK TABLES table WRITE")
2. Query
3. If need be, calculate and commit
4. Unlock with session.execute("UNLOCK TABLES")

Then if another process wants to query while the calculation is
happening, it will have to wait until the table unlocks, and it will
see the result of the commit. The wait time of the locked table is
acceptable.

That should work, but is ugly and, worse, requires explicit MySQL
code. I understand this could lead to dependency on the backend
implementation (ie. If this code was ever used on an sqlite
database?). Regardless, I'd like to do this completely within
sqlalchemy.  Is there a way to do this? It seems like there might be a
way to do this with transactions, but I can't parse it. Thoughts?

Thanks!

-- 
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.

Reply via email to