commit()會先調用flush()清理緩存,然后提交事務;
flush()只清理緩存,不提交事務
Commit操作比較好理解,就是提交一次事務Transaction操作。既然是提交一次事務操作,就包含了增刪改的SQL操作。所以必然是Session通過Connection進行寫磁盤I/O的操作。
Flush不同的是,它並沒有真正的執行事務Transaction的操作,而是更新了數據庫的事務緩存[1]。所以Flush是會和數據庫進行通信的。Flush操作告知數據庫把事務操作緩存在數據庫,直到數據庫收到了Commit操作之后才會真正將操作更新到磁盤中[5]。
You may flush() as often as you like within a transaction to move changes from Python to the database’s transaction buffer.
Flush方法會生成Primary Key,所以哪怕Flush之后並不進行Commit操作,Primary Key也還是會生成。所以下一次Insert一條記錄時,Primary Key會再次加1.
通常如果我們希望在Commit之前獲取到待插入數據的自增主鍵,那我們可以在Commit之前進行Flush操作。這時SQLAlchemy的對象就會獲取到數據庫生成待對應數據行的主鍵值[4]。
Session在進行查詢時(查詢操作之前)會進行一次Flush操作。所以創建了對象,雖然並沒有提交,但是緊接着進行Query操作也能在當前Session中查詢到這個對象[2]。
Flush之后就能在當前Session中看到效果,而Commit之后才能在其他Session中看到效果[3]。
轉自:https://blog.csdn.net/weixin_38888144/java/article/details/106076056
總結:
1. flush會生成primary key
2. 當前緊接着的session可以查到flush做的增刪改的結果
3. 其他session只有在commit之后,才能查到flush做的增刪改結果