Flask-Sqlalchemy 事務


數據庫事務

數據庫事務( transaction)是訪問並可能操作各種數據項的一個數據庫操作序列,這些操作要么全部執行,要么全部不執行,是一個不可分割的工作單位。例如,在新增數據A后更新數據B,當更新數據B失敗后,要回滾數據庫,使得數據A不能新增到數據庫中,這就是數據的原子性。

  • 原子性(Atomicity):事務中的全部操作在數據庫中是不可分割的,要么全部完成,要么全部不執行。
  • 一致性(Consistency):幾個並行執行的事務,其執行結果必須與按某一順序 串行執行的結果相一致。
  • 隔離性(Isolation):事務的執行不受其他事務的干擾,事務執行的中間結果對其他事務必須是透明的。
  • 持久性(Durability):對於任意已提交事務,系統必須保證該事務對數據庫的改變不被丟失,即使數據庫出現故障。

Flask-Sqlalchemy中的事務

SQLAlchemy 的 session 是用於管理數據庫操作的一個像容器一樣的東西. 模型實例對象本身獨立存在, 而要讓其修改(創建)生效, 則需要把它們加入某個 session 。同時你也可以把模型實例對象從 session 中去除。
被 session 管理的實例對象:

session.commit() # 直接將數據庫內存中的數據提交到數據庫,此操作會內部調用session.flush(),其余的事務可以訪問最新的數據;

session.rollback() # 是回滾當前事務的變更數據操作;

session.flush() # 作用是在事務管理內與數據庫發生交互, 對應的實例狀態被反映到數據庫,比如自增 ID 被填充上值,但是數據庫中當前事務的數據值並未更新上;相當於預提交,等於提交到數據庫內存,還未寫入數據庫文件;deletions and modifications to the database as INSERTs, DELETEs, UPDATE;

session.merge(obj) # 查詢更新操作;就是更新之前先查詢,如果沒有自動插入;

簡易更新操作


try:
    user = session.Query(User).first()
    user.name = u'改名字
    session.commit()
except:
    session.rollback()

復雜事務嵌套上下文

t1 = Admin(username='test', password='123456')       # 生成admin表要插入的一條數據
t2 = Admin(username='test1', password='abcdef')      # 生成admin表要插入的一條數據
 
session.add(t2)
 
try:
    with session.begin_nested():
        session.add(t1)  # 或使用session.merge(t1),表示查詢更新操作
except Exception as e:
    print(e)
    session.rollback()
 
session.commit()

簡易嵌套

t1 = Admin(username='test1', password='123456')       # 生成admin表要插入的一條數據
t2 = Admin(username='test2', password='abcdef')      # 生成admin表要插入的一條數據
 
session.add(t2)
 
# 創建一個子嵌套事務,第一個commit只是將子事務的數據托管到父事務,並未提交到數據庫
session.begin_nested()
session.add(t1)
session.commit()
 
# 父事務執行提交,才真正將t1,t2提交到數據庫
session.commit()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM