我有多个进程可能会向数据库中插入重复的行。这些插入操作不是非常频繁(每小时几次),因此性能不是关键问题。
我已经尝试在执行插入操作之前进行存在性检查,具体做法如下:
#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()
检查不会锁定表,因此有可能多个进程同时尝试插入相同的对象。在这种情况下,一个进程成功插入,而其他进程则以完整性错误异常失败。虽然这样可以工作,但我觉得不够“干净”。
我真的很希望在进行exists()
检查之前,有一种锁定Camera表的方法。
UNIQUE
约束,尝试插入新行并在失败时捕获IntegrityError
?这种方法有什么不妥之处吗? - Audrius Kažukauskas