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()
проверять.