Can wrote:
> I'm using MySQL and when I need to lock a table, I do:
>
> conn = engine.connect()
> conn._autocommit = dummyFunc
> conn.execute("LOCK TABLES tablename WRITE")
> try:
> ...
> conn.execute("COMMIT")
> except:
> conn.execute("ROLLBACK")
> ...
> finally:
> conn.execute("UNLOCK TABLES")
> conn.close()
>
> Are there any more pythonic ways to do such tasks?
I use a Python 2.5 context manager to access MySQL named locks; the
approach could easily be adapted to table locks:
## GET_LOCK and the 'with' statement:
con = engine.connect()
with named_lock(con, 'some_thing'):
con.do_stuff()
# with a little work, could do similar for LOCK TABLES:
# with table_locks(con, table1, table2):
# con.do_stuff()
The GET_LOCK context manager looks like this:
import contextlib, exceptions, logging
_log = logging.getLogger('db')
class LockTimeoutException(exceptions.Exception): pass
@contextlib.contextmanager
def named_lock(connection, name, timeout=2):
connection.detach()
have = None
try:
have = connection.scalar("SELECT GET_LOCK(%s, %s)",
name, timeout)
if not have:
raise LockTimeoutException(
"Could not acquire lock '%s'" % name)
yield have
finally:
if have:
try:
connection.execute("SELECT RELEASE_LOCK(%s)", name)
except:
_log.error("Could not release lock '%s'!" % name)
The connection.detach() in there is a little paranoid but probably
a good idea for any of the connection-scoped MySQL trickery. It
ensures that the connection won't re-enter the connection pool and
be reused after you've released it.
I'd also be super careful with locks and transaction management,
the feature is funky and the MySQL reference LOCK TABLES page is
your friend.
-j
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---