SQLAlchemy和显式锁定

时间:2013-01-25 10:55:33

标签: python orm sqlalchemy

我有多个进程可能会将重复的行插入数据库。这些插入不会经常发生(每小时几次),因此它不是性能关键。

我在插入之前尝试过检查,如下所示:

#Assume we're inserting a camera object, that's a valid SQLAlchemy ORM object that inherits from declarative_base...
try:
  stmt = exists().where(Camera.id == camera_id)
  exists_result = session.query(Camera).with_lockmode("update").filter(stmt).first()

  if exists_result is None:
    session.add(Camera(...)) #Lots of parameters, just assume it works
    session.commit()
except IntegrityError as e:
  session.rollback()

我遇到的问题是exist()检查没有锁定表,因此多个进程可能会尝试同时插入同一个对象。在这种情况下,一个进程成功插入,其他进程因IntegrityError异常而失败。虽然这有效,但对我来说感觉并不“干净”。

在进行exists()检查之前,我真的想要一些锁定Camera表的方法。

1 个答案:

答案 0 :(得分:4)

Pehaps这可能是您感兴趣的:

https://groups.google.com/forum/?fromgroups=#!topic/sqlalchemy/8WLhbsp2nls

  

您可以通过直接执行SQL来锁定表。我不确定在Elixir中看起来是什么样的,但是在简单的SA中它会是这样的:     

 conn = engine.connect()
 conn.execute("LOCK TABLES Pointer WRITE")
 #do stuff with conn
 conn.execute("UNLOCK TABLES")