除了autocommit,sessionmaker还有个比较重要的参数——autoflush,其值默认为True,指SQLAlchemy会自动调用session.flush()把当前事务中数据库操作从python缓冲区刷新到数据库事务缓冲区,这里flush和commit容易混淆,可以理解它们之间的区别如下:
flush:预提交,等于提交到数据库内存,但还未写入数据库文件,flush之后仍可以通过session.rollback()回滚之前的操作。
commit:就是把内存里面的东西直接写入数据库文件,可以提供查询了,此时即便调用session.rollback()也无法再撤销之前的操作了。
通常情况下,SQLAlchemy官方建议在sessionmaker中使用autoflush=True, autocommit=False组合,系统会自动帮我们把更新刷新到数据库内存,但最终需要我们手动提交写入数据库文件。注意,不管是进行查询还是更新、删除等操作,最好都显示的提交一下当前事务。如果没有显示调用session.commit()提交事务,程序便直接退出或者调用了session.close(),那么SQLAlchemy默认会回滚之前的操作。这也是导致BUG2的原因,我们程序中有些数据库的查询操作没有显示提交,这样做本质上没有太大问题,因为查询操作不会改变数据库状态,所以提不提交影响不大。只是SQLALchemy是基于事务的,不提交的话SQLALchemy会自动的回滚当前查询操作所在的事务,因此后台日志中会出现一个ROLLBACK相关的信息。
作者:爱吃肉的鱼
链接:https://juejin.cn/post/6844904164141580302
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
网友评论