Django?事務(wù)回滾的具體實(shí)現(xiàn)
一、事務(wù)的四大特性
一般來(lái)說(shuō),事務(wù)是必須滿足4個(gè)條件(ACID)::原子性(Atomicity,或稱不可分割性)、一致性(Consistency)、隔離性(Isolation,又稱獨(dú)立性)、持久性(Durability)。
- 原子性:一個(gè)事務(wù)(transaction)中的所有操作,要么全部完成,要么全部不完成,不會(huì)結(jié)束在中間某個(gè)環(huán)節(jié)。事務(wù)在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤,會(huì)被回滾(Rollback)到事務(wù)開(kāi)始前的狀態(tài),就像這個(gè)事務(wù)從來(lái)沒(méi)有執(zhí)行過(guò)一樣。
- 一致性:在事務(wù)開(kāi)始之前和事務(wù)結(jié)束以后,數(shù)據(jù)庫(kù)的完整性沒(méi)有被破壞。這表示寫入的資料必須完全符合所有的預(yù)設(shè)規(guī)則,這包含資料的精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫(kù)可以自發(fā)性地完成預(yù)定的工作。
- 隔離性:數(shù)據(jù)庫(kù)允許多個(gè)并發(fā)事務(wù)同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫和修改的能力,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離分為不同級(jí)別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復(fù)讀(repeatable read)和串行化(Serializable)。
- 持久性:事務(wù)處理結(jié)束后,對(duì)數(shù)據(jù)的修改就是永久的,即便系統(tǒng)故障也不會(huì)丟失。
二、數(shù)據(jù)庫(kù)事務(wù)
Django中對(duì)于數(shù)據(jù)庫(kù)的事務(wù),默認(rèn)每執(zhí)行一句數(shù)據(jù)庫(kù)操作,便會(huì)自動(dòng)提交,我們需要在保存訂單中自己控制數(shù)據(jù)庫(kù)事務(wù)的執(zhí)行流程
2.1使用裝飾器(整體回滾,不處理異常)
調(diào)用@transaction.atomic,進(jìn)行整體回滾
from django.db import transaction @transaction.atomic def viewfunc(request): ? ? # 這些代碼會(huì)在一個(gè)事務(wù)中執(zhí)行 ? ? #...
2.2使用with語(yǔ)句(部分回滾,不處理異常)
from django.db import transaction def viewfunc(request): ? ? # 這部分代碼不在事務(wù)中,會(huì)被Django自動(dòng)提交 ? ? #... ? ? with transaction.atomic(): ? ? ? ? # 這部分代碼會(huì)在事務(wù)中執(zhí)行 ? ? ? ? #...
注:裝飾器和with語(yǔ)句直接使用會(huì)導(dǎo)致異常沒(méi)有辦法處理,如果需要處理異常,則可以通過(guò)以下的方式進(jìn)行
2.3使用with語(yǔ)句(部分回滾,可以處理異常)
from django.db import transaction def viewfunc(request): ? ? # 這部分代碼不在事務(wù)中,會(huì)被Django自動(dòng)提交 ? ? #... ?? ?try: ? ? ? ? with transaction.atomic(): ? ? ? ? ? ? # 這部分代碼會(huì)在事務(wù)中執(zhí)行 ? ? ? ? ? ? #... ? ? except 異常: ? ? ? ? # 處理異常的代碼
2.4使用保存點(diǎn)(部分回滾,可以處理異常)
需要注意的是要和裝飾器進(jìn)行配合
from django.db import transaction @transaction.atomic def viewfunc(request): ? ? # 這部分代碼不在事務(wù)中,會(huì)被Django自動(dòng)提交 ? ? #... ?? ?try: ? ? ? ? # 在事務(wù)開(kāi)始前創(chuàng)建保存點(diǎn) ? ? ? ? save_id = transaction.savepoint() ? ? ? ? # 這部分代碼會(huì)在事務(wù)中執(zhí)行 ? ? ? ? #... ? ? ? ? # 提交從保存點(diǎn)到當(dāng)前狀態(tài)的所有數(shù)據(jù)庫(kù)事務(wù)操作 ? ? ? ? transaction.savepoint_commit(save_id) ? ? except 異常: ? ? ? ? # 回滾到保存點(diǎn) ? ? ? ? transaction.savepoint_rollback(save_id) ? ? ? ? # 處理異常的代碼
到此這篇關(guān)于Django 事務(wù)回滾的具體實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Django 事務(wù)回滾內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用numpy實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò)
這篇文章主要為大家詳細(xì)介紹了Python使用numpy實(shí)現(xiàn)BP神經(jīng)網(wǎng)絡(luò),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03在Tensorflow中實(shí)現(xiàn)leakyRelu操作詳解(高效)
這篇文章主要介紹了在Tensorflow中實(shí)現(xiàn)leakyRelu操作詳解(高效),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Python使用爬蟲抓取美女圖片并保存到本地的方法【測(cè)試可用】
這篇文章主要介紹了Python使用爬蟲抓取美女圖片并保存到本地的方法,涉及Python基于正則、爬蟲實(shí)現(xiàn)的圖片抓取與保存相關(guān)操作技巧,需要的朋友可以參考下2018-08-08Python+MySQL隨機(jī)試卷及答案生成程序的示例代碼
這篇文章主要介紹了Python+MySQL隨機(jī)試卷及答案生成程序的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02