概要
Transaction是django進行數據庫原子性操作在python層面上的實現。
簡單來說, 被transaction.atomic()包裹的代碼塊只在代碼塊順利完成后進行數據庫層面的commit。實際開發當中,遇到了一些問題。
1. transaction事務內不執行數據庫的commit操作
除非手動commit
transaction最基本的功能。
代碼場景:
在事務當前啟動celery異步任務, 無法獲取未提交的改動。
def example_view(request):
with transaction.atomic():
change_obj() # 修改對象變量
obj.save()
async_task.delay(obj.id)
def async_task(obj_id):
obj = Model.objects.get(pk=obj_id)
read_the_obj() # 讀取對象信息
在使用transaction當中, Model.save()都不做commit,因此如果在transaction當中設置異步任務,使用get()查詢數據庫,將看不到對象在事務當中的改變.這也是實現”可重復讀”的事務隔離級別,即同一個事務里面的多次查詢都應該保持結果不變。
2.transaction只對數據庫層的操作進行事務管理
不能理解為python操作的事務管理
代碼如下:
def example_view(request):
tag = False
with transaction.atomic():
tag = True
change_obj() # 修改對象變量
obj.save()
raise DataError
print("tag = ",tag)
即使事務代碼塊發生了DataError,事務回滾,也僅是數據庫層面的回滾,針對python的操作依然已完成。
甚至是對Model.Object進行的操作會也會存在變量當中。
如:
def example_view(request):
obj.changed = False
with transaction.atomic():
obj.changed = True
change_obj() # 修改對象其他變量
obj.save()
raise DataError
print("obj.changed = ",obj.changed)
發生Dataerror異常的回滾僅在數據庫層面操作,因此不可以根據model object的屬性值判斷是否正確完成了事務。
另外,雖然Django對數據庫層面以ORM完成了很具體的抽象,但應該要清楚地意識到我們操作的model object和數據庫內容本質不同,DJANGO只在查詢和提交時進行數據庫操作。
補充:Django 事務transaction.atomic()的使用方法
看代碼吧~
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import View
from django.db import transaction # 導入事務
# 類視圖 (事務,@transaction.atomic裝飾器)
class MyView(View):
@transaction.atomic
# transaction.atomic裝飾器可以保證該函數中所有的數據庫操作都在一個事務中。
def post(self, request):
# 數據庫操作1。。。
# 數據庫操作2。。。
return HttpResponse('ok')
# 類視圖 (事務,保存點的使用)
class MyView2(View):
@transaction.atomic
def post(self, request):
# 設置事務保存點
s1 = transaction.savepoint() # 可以設置多個保存點
# 數據庫操作。。。
# 事務回滾 (如果發生異常,就回滾事務)
transaction.savepoint_rollback(s1) # 可以回滾到指定的保存點
# 提交事務 (如果沒有異常,就提交事務)
transaction.savepoint_commit(s1)
# 返回應答
return HttpResponse('ok')
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- python django事務transaction源碼分析詳解
- Django bulk_create()、update()與數據庫事務的效率對比分析
- django中使用事務及接入支付寶支付功能
- Django框架orM與自定義SQL語句混合事務控制操作
- django框架事務處理小結【ORM 事務及raw sql,customize sql 事務處理】
- 使用Python的Django框架實現事務交易管理的教程