本文實例講述了django框架事務處理。分享給大家供大家參考,具體如下:
django 中要求事務處理的情況有兩種:
1.基于django orM 的 transaction 處理
2.是基于自定義SQL 語句的transaction的處理,通常是比較復雜的SQL ,用ORM 處理不方便的時候用的。或者是大批量SQL語句執行,比較在意效率的情況下用。
首先說一下第二種情況,因為這種情況相對簡單一點,沒ORM 那么多東西,用我寫的一個方法來解釋
1
2
3
4
5
6
7
8
9
10
11
12
13
|
from django.db import connection, transaction ..... def batch_execsql(sqlarray): cursor = connection.cursor() # 得到處理的游標對象 ret = "" try : for sql in sqlarray: cursor.execute(sql) transaction.commit_unless_managed() # 這是重點,沒有這條語句,就不會commit 。 except Exception,e: #簡單的異常處理,可以忽略 ret = str (e) cursor.close() return ret #有異常則返回異常,否則返回為空字符串 |
由上面可以看出 transaction.commit_unless_managed()
的重要性,這是自定義SQL 語句情況下處理事務的方法. 上面的例子中的 sqlarray 表示一個list,里面有很多自己寫的SQL 語句,而這些語句要求在一個事務中完成。
再來看看第一種情況,用ORM 的時候,事務的處理. 這在django 的官方文檔中有說明,下面簡單翻譯介紹下
1. django 默認的事務, 是自動處理的,當你在調用 orM 的model.save(),model.delete()的時候,所有改動會被立即提交的,相當于數據庫設置了auto commit,沒有隱藏的rollback.
2.對http請求的事務攔截,這是推薦的方式,使用了transaction中間件來完成,這是比較好的方法,但必須在settings.py中配置.
1
2
3
4
5
6
7
|
MIDDLEWARE_CLASSES = ( 'django.middleware.cache.UpdateCacheMiddleware' , 'django.contrib.sessions.middleware.SessionMiddleware' , 'django.middleware.common.CommonMiddleware' , 'django.middleware.transaction.TransactionMiddleware' , 'django.middleware.cache.FetchFromCacheMiddleware' , ) |
但需要注意的是,這樣配置之后,與你中間件的配置順序是有很大關系的。在 TransactionMiddleware 之后的所有中間件都會受到事務的控制。所以當你把session 中間件放到 Transaction之后,同樣會受到影響。但 CacheMiddleware, UpdateCacheMiddleware, and FetchFromCacheMiddleware 不會受到影響,cache機制有自己的處理方式,用了內部的connection來處理
另外 TransactionMiddleware 只對 default 的數據庫配置有效,如果要對另外的數據連接用這種方式,必須自己實現中間件。
3.自己來控制事務,這種情況下,你自己靈活控制事務.在settings.py 中不用配置 TransactionMiddleware 中間件了, 基本采用裝飾模式來實現。
a) @transaction.autocommit
,django默認的事務處理, 采用此裝飾模式會忽略掉全局的transaction 設置
1
2
3
4
5
6
7
|
from django.db import transaction @transaction .autocommit def viewfunc(request): .... @transaction .autocommit(using = "my_other_database" ) def viewfunc2(request): .... |
b) @transaction.commit_on_success
在一個方法中,所有工作完成后,提交事務。
1
2
3
4
5
6
7
|
from django.db import transaction @transaction .commit_on_success def viewfunc(request): .... @transaction .commit_on_success(using = "my_other_database" ) def viewfunc2(request): .... |
c) commit_manually()
,完全自己處理,但如果你沒有調用commit()
或者rollback()
,將會拋出TransactionManagementError 異常.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
from django.db import transaction @transaction .commit_manually def viewfunc(request): ... # You can commit/rollback however and whenever you want transaction.commit() ... # But you've got to remember to do it yourself! try : ... except : transaction.rollback() else : transaction.commit() @transaction .commit_manually(using = "my_other_database" ) def viewfunc2(request): .... |
希望本文所述對大家基于Django框架的Python程序設計有所幫助。
原文鏈接:http://www.yihaomen.com/article/python/267.htm