SQLAlchemy и явная блокировка

У меня есть несколько процессов, которые могут потенциально вставлять повторяющиеся строки в базу данных. Эти вставки происходят не очень часто (несколько раз в час), поэтому они не критичны по производительности.

Я пробовал проверку наличия перед тем, как делать вставку, например:

#Assume we're inserting a camera object, that 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. Хотя это работает, оно не кажется мне "чистым".

Мне бы очень хотелось заблокировать таблицу Camera перед выполнением проверки exists().

Ответ 1

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")