django_事務(wù)回滾
數(shù)據(jù)庫的讀寫操作中横缔,事務(wù)在保證數(shù)據(jù)的安全性和一致性方面起著關(guān)鍵的作用顿痪,而回滾正是這里面的核心操作碳蛋。Django的ORM在事務(wù)方面也提供了不少的API老厌。有事務(wù)出錯(cuò)的整體回滾操作,也有基于保存點(diǎn)的部分回滾份殿。
原子性是數(shù)據(jù)庫事務(wù)的定義屬性膜钓。atomic 允許我們創(chuàng)建一個(gè)代碼塊,在該代碼塊中保證數(shù)據(jù)庫的原子性卿嘲。如果代碼塊成功完成颂斜,則更改將提交到數(shù)據(jù)庫。如果存在異常拾枣,則回滾更改沃疮。
atomic塊可以嵌套。在這種情況下梅肤,當(dāng)內(nèi)部塊成功完成時(shí)司蔬,如果稍后在外部塊中引發(fā)異常,則仍可以回滾其效果姨蝴。
from django.db import IntegrityError, transaction
@transaction.atomic
def viewfunc(request):
create_parent()
try:
with transaction.atomic():
generate_relationships()
except IntegrityError:
handle_exception()
add_children()
在此示例中俊啼,即使generate_relationships()通過破壞完整性約束導(dǎo)致數(shù)據(jù)庫錯(cuò)誤,您也可以執(zhí)行查詢 add_children()左医,并且create_parent()仍然存在更改授帕。請(qǐng)注意,嘗試的任何操作在調(diào)用generate_relationships() 時(shí)都已經(jīng)安全回滾handle_exception()浮梢,因此異常處理程序也可以在必要時(shí)對(duì)數(shù)據(jù)庫進(jìn)行操作跛十。