Django model 层之事务管理总结

by:授客 QQ1033553122

实践环境

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)

 

也可以传递匿名函数

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/

Django model 层之事务管理总结的更多相关文章

  1. day 57 Django基础五之django模型层之关联管理器

    Django基础五之django模型层之关联管理器   class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况 ...

  2. Spring企业级程序设计 • 【第4章 Spring持久化层和事务管理】

    全部章节   >>>> 本章目录 4.1 配置数据源资源 4.1.1 JdbcTemplate介绍 4.1.2通过ComboPooledDataSource创建数据源 4.1. ...

  3. Django基础五之django模型层之关联管理器

    class RelatedManager "关联管理器"是在一对多或者多对多的关联上下文中使用的管理器.它存在于下面两种情况: ForeignKey关系的“另一边”.像这样: 1 ...

  4. SSH(六)hibernate持久层模板于事务管理

    持久层只要完成数据对数据库增删改查的操作,我们常说的hibernate区别于mybatis是在于他的全自动,而hibernate的全自动则主要体现于 他的模板,一些简单的数据操作我们就不用再去手写sq ...

  5. Hibernate与Spring的事务管理

    什么是事务 这个问题比较大,按照我的理解就是,一个事务内的n个操作,要么全部完成,一旦有一个操作有问题,那么所有的操作都全部回滚. Jdbc的事务 首先,大家已经知道了,事务说白了就是一个词----统 ...

  6. Spring整合Hibernate:2、使用Annotation方式进行声明式的事务管理

    1.加入DataSourceTransactionManager的命名空间 修改applicationContext.xml文件,增加如下内容: 1 2 3 4 5 6 7 8 9 10 11 12 ...

  7. PHP MVC 中的MODEL层

    Model层,就是MVC模式中的数据处理层,用来进行数据和商业逻辑的装封 三.实现你的Mode层 Model层,就是MVC模式中的数据处理层,用来进行数据和商业逻辑的装封,进行他的设计的时候设计到三个 ...

  8. Spring+Mybatis+MySql+Maven 简单的事务管理案例

    利用Maven来管理项目中的JAR包,同时使用Spring在业务处理层进行事务管理.数据库使用MySq,数据处理层使用Spring和Mybatis结合. 本案例代码主要结构如图: 1.数据库脚本 -- ...

  9. Spring编程式事务管理

    --------------------siwuxie095                                 Spring 编程式事务管理         以转账为例         ...

  10. Spring总结九:事务管理机制

    何为事务 事务(Transaction),一般是指要做的或所做的事情.在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或编程语言(如SQL ...

随机推荐

  1. MyBatis数据源模块源码分析

    数据源对象是比较复杂的对象,其创建过程相对比较复杂,对于 MyBatis 创建数据源,具体来讲有如下难点: MyBatis 不但要能集成第三方的数据源组件,自身也提供了数据源的实现: 数据源的初始化参 ...

  2. VS2019编译Opencv4.6.0GPU版本(支持40系显卡)

    1 准备工具 CMake CUDA Toolkit + CUDNN VIstual Studio 2019 OpenCV + OpenCV_contrib 点击上面链接跳转,我使用的是CMake3.2 ...

  3. Linux-线程优先级学习

    概念 Linux系统中常用的几种调度类为SCHED_NORMAL.SCHED_FIFO.SCHED_RR. SCHED_NORMAL:用于普通线程的调度类 SCHED_FIFO和SCHED_RR是用于 ...

  4. pandas基础--基本功能

    pandas含有是数据分析工作变得更快更简单的高级数据结构和操作工具,是基于numpy构建的. 本章节的代码引入pandas约定为:import pandas as pd,另外import numpy ...

  5. NCNN的内存显存分配器ncnn::Allocator & ncnn::VkAllocator翻译及其差异对比的学习笔记(nihui亲审过滴)

    NCNN的内存分配器 ncnn::Allocator 通用内存分配器   ncnn::PoolAllocator 内存池分配器 可以设置池大小,减少分配内存和析构内存次数,空间换时间   ncnn:: ...

  6. java springboot 指定运行端口

    java springboot 指定运行端口 方法1: 修改源代码里的"\src\main\resources\application.properties" 文件,增加或修改 s ...

  7. categraf托管与自升级

    categraf支持多种方式进行部署.托管,社区里部署和管理categraf也是五花八门,大家自己使用方便即可. 之前我们觉得大家通过ansible之类的工具批量下发/更新就能很简单地完成任务,最近很 ...

  8. kali更换apt镜像

    kali更换apt镜像 vim /etc/apt/sources.list 进来之后按i进入编辑模式,把其他的镜像#注释掉之后,加上新的镜像,然后esc退出编辑,按:输入wq保存并退出! 上面的办法不 ...

  9. Charles抓不到包常见原因排查

    Charles抓不到包常见原因排查 1.1.1配置代理端口 1.wifi设置代理 2.Charles客户端安装证书 3.Charles 配置抓取域名或IP 4.配置域名 Focus 重点

  10. WPF/C#:在DataGrid中显示选择框

    前言 在使用WPF的过程中可能会经常遇到在DataGrid的最前或者最后添加一列选择框的需求,今天跟大家分享一下,在自己的项目中是如何实现的. 整体实现效果如下: 如果对此感兴趣,可以接下来看具体实现 ...