使用Python(SQLAlchemy)和MariaDB,我尝试执行三次插入,其中第三次插入的约束要求前两次插入成功。然而,目前第三次插入失败,除非前两次插入已经提交。我想在一个事务中执行所有三次插入,如果发生错误则回滚。
代码如下所示:
try:
ulcdb.add_person(uid, lang)
ulcdb.add_group(gid, gid_number)
ulcdb.add_membership(uid, gid, 'owner')
ulcdb.commit()
except Exception as e:
ulcdb.rollback()
logger.error(str(e))
raise
字符串
其中ulcdb
是以下类的示例:
class UserLifecycleDatabase:
def __init__(self):
engine = sqlalchemy.create_engine(url)
Session = sqlalchemy.orm.sessionmaker(bind=engine)
self.session = Session()
def commit(self):
self.session.commit()
def rollback(self):
self.session.rollback()
def add_person(self, uid, lang):
self.session.add(Person(uid=uid, lang=lang))
...
型
如果我提交了前两个插入,那么第三个也会成功。我做错了什么?
1条答案
按热度按时间u3r8eeie1#
解决方案是在插入后运行
session.flush()
而不是session.commit()
。这样,满足约束所需的信息就可以提供给会话,并且第三次插入成功。然后可以提交整个事务。但是,如果发生异常,则可以回滚任何成功的插入。