代码:

with transaction.atomic():
for i in xrange(int(svc_instance_num)):
tmp_fileprotect_svc_instance = FILE_PROTECT_INSTANCE(customer_id=customer_id, order_id=order_id, svc_id=svc_id,
svc_profile_list=json.dumps(svc_profile_list), svc_instance_num=svc_instance_num+"-"+str(i),
svc_sell_time=svc_sell_time, svc_time_len=svc_time_len, svc_end_time=svc_end_time, svc_sell_price=svc_sell_price,
info=info)
tmp_fileprotect_svc_instance.save()
import uuid
tmp_fileprotect_svc_instance.device_hash = uuid.uuid3(uuid.uuid1(), str(tmp_fileprotect_svc_instance.id))
tmp_fileprotect_svc_instance.save()
from django.forms.models import model_to_dict
data.append(model_to_dict(tmp_fileprotect_svc_instance))

Django默认的事务行为

默认情况下,在Django中事务是自动提交的。当我们运行Django内置的模板修改函数时,例如调用model.save()或model.delete()时,事务将被立即提交。这种机制和数据库的自动提交事务机制类似。记住这里没有默认的回滚机制。

在HTTP请求上加事务

对于Web请求,Django官方推荐使用中件间TransactionMiddleware来处理请求和响应中的事务。它的工作原理是这样的:当一个请求到来时,Django开始一个事务,如果响应没有出错,Django提交这期间所有的事务,如果view中的函数抛出异常,那么Django会回滚这之间的事务。

为了实现这个特性,需要在MIDDLEWARE_CLASSES setting中添加TransactionMiddleware:

MIDDLEWARE_CLASSES = (

'django.middleware.cache.UpdateCacheMiddleware',

'django.contrib.sessions.middleware.SessionMiddleware',

'django.middleware.common.CommonMiddleware',

'django.middleware.transaction.TransactionMiddleware',

'django.middleware.cache.FetchFromCacheMiddleware',

)

顺序很重要,TransactionMiddleware中间件会将置于其后的中间件都包含在事务的范围之中(用于缓存的中间件除外,他们不受影响,例如CacheMiddleware,UpdateCacheMiddlewareFetchFromCacheMiddleware)。

另外需要注意的是,TransactionMiddleware只会影响DATABASES设置中的默认的数据库,对于其它的数据库,如果我们实现事务控制的话只能用别的方案了。

在View中实现事务控制

如果想在更细粒度的条件下(例如在一个view函数中)控制事务,我们可以使用django.db.transaction。有两种用法:

1.使用装饰器

from django.db import transaction

@transaction.commit_on_success

def viewfunc(request):

# ...

# this code executes inside a transaction

# ...

2.使用context manager

from django.db import transaction

def viewfunc(request):

# ...

# this code executes using default transaction management

# ...

with transaction.commit_on_success():

# ...

# this code executes inside a transaction

# ...

这两种方法都可以正常工作。不过如果使用的Python版本为2.5并且要使用with语法的话,还需加一句

from __future__ import with_statement。

所以为了最大的兼容性,下面的示例使用装饰器来实现事务。

autocommit()

使用autocommit装饰器可以将view函数中的事务还原成Django默认的自动提交模式,无视全局事务的设置。

示例:

from django.db import transaction

@transaction.autocommit

def viewfunc(request):

....

@transaction.autocommit(using="my_other_database")

def viewfunc2(request):

....

commit_on_success()

顾名思义,view函数成功则提交事务,否则回滚。用法同上。

commit_manually()

告诉Django我们将自己控制函数中的事务处理。并且要注意,如果在视图函数中改变了数据库的数据并且没有调用commit() 或rollback(),那么将抛出TransactionManagementError异常。

示例:

from django.db import transaction

@transaction.commit_manually

def viewfunc(request):

...

# You can commit/rollback however and whenever you want

transaction.commit()

...

# But you've got to remember to do it yourself!

try:

...

except:

transaction.rollback()

else:

transaction.commit()

@transaction.commit_manually(using="my_other_database")

def viewfunc2(request):

....

本文内容全部由Django官方文档翻译而来,参考资料是相关的文档。如果要查看原文或是关于事务更多的细节(例如保存点),可以查阅。

参考资料:

Django官方文档关于事务的说明

参考资料:http://blog.sina.com.cn/s/blog_3fe961ae010167ah.html

【Python】Django支持事务方式的更多相关文章

  1. Python Django,事务,transaction.atomic,事务保存点

    from django.shortcuts import renderfrom django.http import HttpResponsefrom django.views.generic imp ...

  2. 探索 Python/Django 支持分布式多租户数据库,如 Postgres+Citus

    在 确定分布策略 中,我们讨论了在多租户用例中使用 Citus 所需的与框架无关的数据库更改. 在这里,我们专门研究如何借助 django-multitenant 库将多租户 Django 应 用程序 ...

  3. Django-Multitenant,分布式多租户数据库项目实战(Python/Django+Postgres+Citus)

    Python/Django 支持分布式多租户数据库,如 Postgres+Citus. 通过将租户上下文添加到您的查询来实现轻松横向扩展,使数据库(例如 Citus)能够有效地将查询路由到正确的数据库 ...

  4. Python Django框架笔记(三):django工作方式简单说明和创建用户界面

    (一)  说明 简单说明下django的工作方式,并举2个例子. (二)  Django工作方式 假定我们有下面这些文件 ,这里在前2篇的基础上增加了 templates目录(存放html文件) 和s ...

  5. Spring+Mybatis多数据源的一种实现方式,支持事务

    最近一个项目用到了多个数据库,所以需要实现动态切换数据源来查询数据,http://www.cnblogs.com/lzrabbit/p/3750803.html这篇文章让我受益匪浅,提供了一种自动切换 ...

  6. python:Django

    Python的WEB框架有Django.Tornado.Flask 等多种 web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客 ...

  7. python Django教程 之 安装、基本命令、视图与网站

    python  Django教程  之 安装.基本命令.视图与网站 一.简介 Django 中提供了开发网站经常用到的模块,常见的代码都为你写好了,通过减少重复的代码,Django 使你能够专注于 w ...

  8. Sublime 3 打造成 Python/Django IDE开发利器

    Sublime Text 是一款非常强大的文本编辑器, 下面我们介绍如何将 Sublime Text 3 打造成一款 Python/Django 开发利器:   1. 安装 Sublime Text ...

  9. python Django知识点总结

    python Django知识点总结 一.Django创建项目: CMD 终端:Django_admin startproject sitename(文件名) 其他常用命令: 其他常用命令: 通过类创 ...

随机推荐

  1. 使用Git进行代码管理心得

    关于使用Git for Windows来clone和上传项目 首先到Git for Windows的官网下载并安装 在本地用来保存clone文件的文件夹右键,选择Git Bash Here: 在打开的 ...

  2. inline-block 和 float 的区别

    1.float元素会自动成为一个块元素. 2.float元素,会脱离文档流!   默认脱离文档流的元素的z-index值是比没有脱离文档流的元素高的! 3.float:没有上下哦,  上下用margi ...

  3. cygwin 的不同文件类型显示不同的颜色

    正常情况下,我们的cygwin安装好之后,不管是文件还是文件夹显示的颜色都是一样的,这样在我们平时的工作中很不方便 所以这里记录一下怎么设置成彩色的,其实很简单. 直接修改文件 .bashrc vim ...

  4. XCode7继续用http协议解决办法

    昨天被苹果放鸽子也没升级iOS9,今天升级了Xcode7,同时手机升级了iOS9,发现项目报错,查了查才知道是iOS9不支持不安全的http传输协议,让用https协议,这根本就不x现实,,服务端根本 ...

  5. knockout——官网demo

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. Java设计模式-享元模式(Flyweight)

    享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用. FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查 ...

  7. 【kAri OJ】621. 廖神的树

    时间限制 3000 ms 内存限制 65536 KB 题目描述 廖神和男神在植树节的时候准备玩一个奇怪的游戏,他们现在有一个被分割成n*n个格子的矩形土地,他们现在准备往这个地里种树,但这个种树游戏必 ...

  8. 排序算法(一)(时间复杂度均为O(n*n))

    对于一个int数组,请编写一个选择排序算法,对数组元素排序. 给定一个int数组A及数组的大小n,请返回排序后的数组. 测试样例: [1,2,3,5,2,3],6 [1,2,2,3,3,5] 冒泡排序 ...

  9. appium-向右滑动定位

    上面5幅欢迎图,要向右滑动4次再点击[立即体验]才可以到首屏 #首页欢迎图滑动4次 for i in range(4): driver.swipe(1200, 200, 10, 200, 1500) ...

  10. 初学Hibernate主键生成策略

    具有业务含义的主键叫自然主键:随机生成,不具备业务含义的字段作为主键,叫代理主键. 在表与POJO类关系映射文件XXX.hbm.xml中,可通过配置id元素下generator节点的class属性指定 ...