У меня есть несколько процессов, которые могут потенциально вставлять повторяющиеся строки в базу данных. Эти вставки происходят не очень часто (несколько раз в час), поэтому они не критичны по производительности.
Я пробовал проверку наличия перед тем, как делать вставку, например:
#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()
.