介绍

函数说明

from django.db import transaction
transaction.atomic  # 原子性操作,把一系列操作当做一个整体,错了则集体回退
transaction.on_commit(func,using = None) # 在整个事件完成后,执行func函数

使用方法


from django.db import transaction
# atomic
@transaction.atomic
def index(request):
... def index(request):
with transation.atomic():
....
.... # on_commit
@transaction.atomic
def index(request):
do_something...
transation.oncommit(func)

示例

from django.db import models

class Account(models.Model):
nid = models.IntegerField(primary_key=True)
money = models.IntegerField(verbose_name="余额")

models.py

from django.contrib import admin
from django.urls import path,re_path,include
from app01 import views urlpatterns = [
re_path("index.html",views.index)
]

urls.py

1、正常情况,转账成功

from django.shortcuts import render,HttpResponse
from app01 import models
from django.db.models import F def index(request):
models.Account.objects.filter(nid=1).update(money=F("money")-1) # 账号1给账号2转账1元钱
# raise IndexError
models.Account.objects.filter(nid=2).update(money=F("money")+1)
return HttpResponse("OK")

views.py

2、转账到一半出现错误

from django.shortcuts import render,HttpResponse
from app01 import models
from django.db.models import F def index(request):
models.Account.objects.filter(nid=1).update(money=F("money")-1)
raise IndexError
models.Account.objects.filter(nid=2).update(money=F("money")+1)
return HttpResponse("OK")

views.py

3、还原所有money到1000,配置事务

from django.shortcuts import render,HttpResponse
from app01 import models
from django.db import transaction
from django.db.models import F def index(request):
with transaction.atomic():
models.Account.objects.filter(nid=1).update(money=F("money")-1)
raise IndexError
models.Account.objects.filter(nid=2).update(money=F("money")+1)
return HttpResponse("OK") # 可以使用装饰器
# @transaction.atomic
# def index(request):
# models.Account.objects.filter(nid=1).update(money=F("money")-1)
# raise ValueError("出错")
# models.Account.objects.filter(nid=2).update(money=F("money")+1)
# return HttpResponse("OK")

views.py

4、验证on_commit

说明:如果原子性操作出错,则整个on_commit都不会执行,无论on_commit放在什么位置。这与直接在该位置执行func是不一样的。

from django.shortcuts import render,HttpResponse
from app01 import models
from django.db import transaction
from django.db.models import F def before():
print("before")
# 可以做一些特定工作,如发邮件、记录log def after():
print("after") @transaction.atomic
def index(request):
transaction.on_commit(before)
models.Account.objects.filter(nid=1).update(money=F("money")-1)
# raise ValueError("出错")
models.Account.objects.filter(nid=2).update(money=F("money")+1)
transaction.on_commit(after)
return HttpResponse("OK")

views.py

from django.shortcuts import render,HttpResponse
from app01 import models
from django.db import transaction
from django.db.models import F def before():
print("before")
# 可以做一些特定工作,如发邮件、记录log def after():
print("after") @transaction.atomic
def index(request):
transaction.on_commit(before)
models.Account.objects.filter(nid=1).update(money=F("money")-1)
raise ValueError("出错")
models.Account.objects.filter(nid=2).update(money=F("money")+1)
transaction.on_commit(after)
return HttpResponse("OK")

触发错误,raise ValueError,未出现func的东西

最新文章

  1. 【Python图像】给你的头像+1
  2. MS SQL 错误:无法绑定由多个部分组成的标识符 "xxxxx"
  3. ajax 通用方法,从thinkphp中拔出来的
  4. linux挂载数据盘
  5. 关于python
  6. wordpress自动清理评论回收站
  7. 如何启动或关闭oracle的归档(ARCHIVELOG)模式
  8. 关于 Block的使用
  9. SQL查詢數據字典
  10. Windows Live Writer教程及代码高亮工具
  11. MYSQL 中的变量
  12. 短路与&&和按位与&的区别
  13. RabbitMQ安装以及java使用(二)
  14. RecyclerView用法
  15. Javascript校验密码复杂度的正则表达式
  16. 新版的K8S中的flannel.yaml文件中要注意的细节
  17. Loogn.OrmLite文档
  18. CompletableFuture 专题
  19. Linux 线程调度与优先级
  20. Python tips: 什么是*args和**kwargs?

热门文章

  1. python 定时器schedule执行任务
  2. P2327 [SCOI2005]扫雷
  3. 数据库 —— mySQL相关
  4. 【 腾讯敏捷转型No.4 】为什么敏捷团队不要超过15人
  5. Yosimite 系统 “发生意外错误(错误代码-50)” (记一次macbook pro(mid2012) 自主维修排错经历)
  6. MySQL日期时间处理函数
  7. Unix中Signal信号的不同
  8. python 第一课作用
  9. Weblogic申请和配置SSL证书
  10. Docker:unauthorized: incorrect username or password.