在Pyramid中,如果您已将会话(脚手架自动为您配置)配置为使用
ZopeTransactionExtension,则在执行视图之后才刷新/提交会话。如果您想自己查看任何SQL错误,则需要强制
flush将SQL发送到引擎。
DBSession.flush()应该在以后做
add(...)。
更新资料
我用一个保存点的示例来更新此答案,只是因为关于如何使用事务包执行此操作的示例很少。
def create_unique_object(db, max_attempts=3): while True: sp = transaction.savepoint() try: obj = MyObject() obj.identifier = uuid.uuid4().hex db.add(obj) db.flush() except IntegrityError: sp.rollback() max_attempts -= 1 if max_attempts < 1: raise else: return objobj = create_unique_object(DBSession)
请注意,如果不使用表级锁定,即使这样也很容易在事务之间重复,但这至少说明了如何使用保存点。



