dajngo 數據庫事物的處理

[Django學習]事務處理 
其實事務處理已經在 django 中提供了,可是很奇怪好象沒有過多的「筆墨」來講明這個事。今天看了看,真是很是簡單。具體的在 django 所帶的 transaction 文檔中。 

django對於事務的支持分幾個層次。 

1. 什麼都無論的話,它是使用 autocommit 方式。也就是在執行了 save() 或 delete() ,等修改數據庫的語句以後就自動提交了。 

2. 經過增長 Transaction 中間件來實現自動的事務支持。我感受這個是很是方便的作法。使用它,你首先須要在 settings.py 中增長一箇中間件的設置: 

MIDDLEWARE_CLASSES = ( 
"django.middleware.common.CommonMiddleware", 
"django.middleware.sessions.SessionMiddleware", 
"django.middleware.cache.CacheMiddleware", 
"django.middleware.transaction.TransactionMiddleware", 


但要注意,這個設置與其它的中間件的順序是有關的。因此置於 TransactionMiddleware 以後的中間件也將受事務的控制。所以,若是把 session 中間件放在 Transaction 以後,它也會受到影響。不過文檔上說 Cache 沒有關係,由於它使用自已內部的數據庫處理。 

那麼只要設置這個中間件以後,事務機制就自動生效了。你不須要在 View 代碼中作特殊的處理。只要一個 View 在 Response 返回成功,事務就自動提交。一旦出現異常,事務就回滾。太方便了。所以 Woodlog 中我只加了這麼個設置,其它的我都沒有動。並且我測試了一下,故意引起一個異常,數據並無真實插入

3. 自已來控制事務 

若是你不喜歡 django 爲你實現的這種事務方式,你還能夠自已來控制事務,這時你能夠不安裝 TransactionMiddleware中間件了。基本上都是經過 decorator 來實現的,即在每一個View函數前加上decorator的修飾。好比: 

@transaction.autocommit 
就是實現了缺省狀態的事務處理,即碰上 save() 或 delete() 就自動提交。 
@transaction.commit_on_success 
當整個view成功後提交事務,不然回滾,這與 TransactionMiddleware提供的方式是同樣的。 
@transaction.commit_manually 
這是最手動的方式。你須要顯示地調用commit或rollback。 
具體的例子參見 Transaction 文檔。 

同時 Django 能夠容許你在 settings.py 設置 DISABLE_TRANSACTION_MANAGEMENT 爲 True 來禁止事務處理。這樣在你須要時你能夠自已來進行控制事務。 

感受 TransactionMiddleware 的使用真是方便啊。數據庫

相關文章
相關標籤/搜索