W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Django 在 ?django.db.transaction
? 模塊中提供了一個 API 來管理每個數(shù)據(jù)庫連接的自動提交狀態(tài)。
這些函數(shù)使接受一個 ?using
?參數(shù)表示所要操作的數(shù)據(jù)庫。如果未提供,則 Django 使用 "?default
?" 數(shù)據(jù)庫。
自動提交默認(rèn)為開啟,如果你將它關(guān)閉,自己承擔(dān)后果。
一旦你關(guān)閉了自動提交, Django 將無法幫助你,數(shù)據(jù)庫將會按照你使用的數(shù)據(jù)庫適配器的默認(rèn)行為進(jìn)行操作。
在關(guān)閉自動提交之前,你必須確保當(dāng)前沒有活動的事務(wù),通常你可以執(zhí)行 ?commit()
? 或者 ?rollback()
? 函數(shù)以達(dá)到該條件。
當(dāng)一個原子 ?atomic()
? 事務(wù)處于活動狀態(tài)時, Django 將會拒絕關(guān)閉自動提交的請求,因為這樣會破壞原子性。
事務(wù)是指具有原子性的一系列數(shù)據(jù)庫操作。即使你的程序崩潰,數(shù)據(jù)庫也會確保這些操作要么全部完成要么全部都未執(zhí)行。
Django 不提供啟動事務(wù)的 API。 啟動事務(wù)的預(yù)期方法是使用 ?set_autocommit()
? 禁用自動提交。
進(jìn)入事務(wù)后,你可以選擇在 ?commit()
? 之前應(yīng)用執(zhí)行的更改,或者使用 ?rollback()
? 取消它們。這些函數(shù)在 ?django.db.transaction
? 中定義。
這些函數(shù)使接受一個 ?using
?參數(shù)表示所要操作的數(shù)據(jù)庫。如果未提供,則 Django 使用 "?default
?" 數(shù)據(jù)庫。
當(dāng)一個原子 ?atomic()
? 事務(wù)處于活動狀態(tài)時, Django 將會拒絕進(jìn)行事務(wù)提交或者事務(wù)回滾,因為這樣會破壞原子性。
保存點在事務(wù)中是標(biāo)記物,它可以使得回滾部分事務(wù),而不是所有事務(wù)。 SQLite, PostgreSQL, Oracle, 和 MySQL (當(dāng)使用 InnoDB 存儲引擎) 后端提供了保存點。其他后端提供了保存點函數(shù),但它們是空操作——它們實際上沒有做任何事情。
如果你正在使用 Django 的默認(rèn)行為——自動提交,保存點并不特別有用。盡管,一旦你用 ?atomic()
?打開了一個事務(wù),那么需要構(gòu)建一系列的等待提交或回滾的數(shù)據(jù)庫操作。如果發(fā)出回滾,那么會回滾整個事務(wù)。保存點有能力執(zhí)行顆粒度級別的回滾,而不是由 ?transaction.rollback()
? 執(zhí)行的完全回滾。
當(dāng)嵌套了 ?atomic()
? 裝飾器,它會創(chuàng)建一個保存點來允許部分提交或回滾。強(qiáng)烈推薦只使用 ?atomic()
? 而不是下面描述的函數(shù),但它們?nèi)匀皇枪?API 的一部分,而且沒計劃要棄用它們。
這里的每一個函數(shù)使用 ?using
?參數(shù),這個參數(shù)為應(yīng)用的數(shù)據(jù)庫名。如果沒有 ?using
?參數(shù),那么會使用 "?default
?" 數(shù)據(jù)庫。
保存點由 ?django.db.transaction
?中的三個函數(shù)來控制:
創(chuàng)建新的保存點。這標(biāo)志著事務(wù)中已知處于“良好”狀態(tài)的一個點。返回保存點ID (?sid
?) 。
釋放保存點 ?sid
?。自保存點被創(chuàng)建依賴執(zhí)行的更改成為事務(wù)的一部分。
回滾事務(wù)來保存 ?sid
?。
如果不支持保存點或數(shù)據(jù)庫在自動模式時,這些函數(shù)不執(zhí)行操作。
另外,還有一個實用功能:
重置用于生成唯一保存點ID的計數(shù)器。
下面的例子演示保存點的用法:
from django.db import transaction
# open a transaction
@transaction.atomic
def viewfunc(request):
a.save()
# transaction now contains a.save()
sid = transaction.savepoint()
b.save()
# transaction now contains a.save() and b.save()
if want_to_keep_b:
transaction.savepoint_commit(sid)
# open transaction still contains a.save() and b.save()
else:
transaction.savepoint_rollback(sid)
# open transaction now contains only a.save()
保存點可能通過執(zhí)行部分回滾來恢復(fù)數(shù)據(jù)庫錯誤。如果你在 ?atomic()
? 塊中執(zhí)行此操作,那么整個塊將仍然被回滾,因為它不知道你已經(jīng)處理了較低級別的情況。為了防止發(fā)生,你可以使用下面的函數(shù)控制回滾行為。
當(dāng)存在內(nèi)部原子塊時,設(shè)置回滾標(biāo)記為 ?True
?將強(qiáng)制回滾。這對于觸發(fā)回滾而不引發(fā)異??赡芎苡杏谩?br>將它設(shè)置為 ?False
?會防止這樣的回滾。在這樣做之前,確保你已經(jīng)將事務(wù)回滾到當(dāng)前原子塊中一個正常的保存點。否則你會破壞原子性并且可能發(fā)生數(shù)據(jù)損壞。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: