前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django model 层之事务管理总结

Django model 层之事务管理总结

作者头像
授客
发布2020-08-17 17:07:59
6780
发布2020-08-17 17:07:59
举报
文章被收录于专栏:授客的专栏授客的专栏

Django model 层之事务管理总结

by:授客 QQ:1033553122

实践环境

Python版本:python-3.4.0.amd64

下载地址:https://www.python.org/downloads/release/python-340/

Win7 64位

Django 1.11.4

下载地址:https://www.djangoproject.com/download/

管理数据库事务

Django默认事务机制

Django默认事务自动提交模式。每个查询都会被立即提交到数据量,除非查询是未于事务之内。

显示控制事务

atomic(using=None, savepoint=True)

用法1:把atomic当装饰器使用

from django.db import transaction

@transaction.atmoic

def viewfunc(request):

# 函数中的代码将放在同一个事务中,一起执行

do_stuff()

用法2:把atomic当上下文管理器使用

from django.db import transaction

def viewfunc(request):

do_stuff() # 这部分代码会采用Django默认事务管理模式-自动提交

with transaction.atomic():

# 以下代码(with作用范围内的),将放在同一个事务中,一起执行

do_more_stuff()

可以把atomic封装在一个try/except语句块内

from django.db import transaction

def viewfunc(request):

create_parent()

try:

with transaction.atomic():

do_stuff()

except Exception as e:

handle_exception()

add_children()

说明:

如果try:...except 语句块发生异常,那么do_stuff()所作的改变将被回滚。但是create_parent(),add_children()所作的改变不会被回滚。

特别要注意,不要在with transaction.atomic():作用范围内捕获异常,否则会有意想不到的后果,因为Django是根据未捕获的数据库异常来判断并执行回滚的

处于性能考虑,尽量保证事务尽可能的小,特别是在atomic()内放置处理需要耗时较长的程序代码。

参考链接:

https://docs.djangoproject.com/en/2.0/topics/db/transactions/#controlling-transactions-explicitly

事务之后的操作

on_commit(func, using=None)

from django.db import transaction

def do_something():

pass # send a mail, invalidate a cache, fire off a Celery task, etc.

transaction.on_commit(do_something)

代码语言:javascript
复制

也可以传递匿名函数

transaction.on_commit(lambda: some_celery_task.delay('arg1'))

注意:on_commit中的回调函数仅在前面的事务成功提交后才被执行,否则会被忽略。

保存点(savepoint)

with transaction.atomic(): # Outer atomic, start a new transaction

transaction.on_commit(foo)

with transaction.atomic(): # Inner atomic block, create a savepoint

transaction.on_commit(bar)

# foo() 和 bar() 将在离开最外层语句块时被调用。

with transaction.atomic(): # Outer atomic, start a new transaction

transaction.on_commit(foo)

try:

with transaction.atomic(): # Inner atomic block, create a savepoint

transaction.on_commit(bar)

raise SomeError() # Raising an exception - abort the savepoint

except SomeError:

pass

# foo() will be called, but not bar()

https://docs.djangoproject.com/en/2.0/topics/db/transactions/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档