往数据库写入数据时,不经意间就会写入不完整的数据,我们称之为脏数据。事务管理(transaction)可以防止这种情况发生。事务管理一旦检测到写入异常,会执行回滚操作,即要么写入完整的数据,要么不写入。在Django中使用事务很简单:

  1.新建项目Transaction,创建应用app01,编辑models创建两张表并执行数据库迁移,如下:

from django.db import models

class UserInfo(models.Model):
username = models.CharField(max_length=32)
email = models.EmailField(max_length=64) class Dept(models.Model):
title = models.CharField(max_length=32)

  2.定义路由:

from django.conf.urls import url
from app01 import views urlpatterns = [
url(r'^test/$', views.test),
]

  3.定义test视图函数;

from django.shortcuts import render, HttpResponse
from . import models def test(request):
try:
from django.db import transaction # 导入事务
with transaction.atomic():
user_obj = models.UserInfo.objects.create(username='Lena', email='example@live.com')
dept_obj = models.Dept.objects.create(title='IT')
except Exception as e:
return HttpResponse('error happened, db rollback') return HttpResponse('OK')
复制代码

  

说明:

  1. 以上将创建user_objdept_obj记录的行为组合成一个不可分割的原子性操作,原子内执行的数据库操作发生任何异常,都会执行回滚操作。
  2. 事物检查异常回滚,但是不容错,错误还是会抛出,因此这里用了异常捕捉。
  3. 正常情况下访问http://127.0.0.1:8000/test/,将会得到OK响应,如果我们手动将dept_obj = models.Dept.objects.create(title='IT')title='IT'改为name='IT',手动造成异常,那么会触发事物回滚,写入的user_obj也会撤销。这一点可以查看数据库验证。

  注意:事务需要数据库引擎支持,比如Innodb引擎就是支持的。

django事物回滚的更多相关文章

  1. msql,触发器无事物回滚,插入之前满足条件再插入

    很少写mysql的触发器和存储过程,由于需要需要做一个很小的判断,要用到触发器,要达到的效果就是,插入之前判断是否满足条件如果不满足就不插入 如果用sqlserver 或者orcale 就很简单,按s ...

  2. 复习课程jdbc:使用配置文件properties进行连接数据库,数据库存取图片,批处理,时间戳,事物回滚等等

    使用配置文件properties进行连接数据库 首先创建一个file自定义文件名,但是后缀名必须改为.properties(不分大小写):如config.properties: 然后双击config. ...

  3. Spring aop切面插入事物回滚

    <!-- tx标签配置 事物--> <tx:advice id="txadvice" transaction-manager="transactionM ...

  4. springboot事物回滚

    要添加事物 必须在方法上添加 @Transactional 注解 如果需要事物回滚有两个条件 1.方法中有异常或者主动抛异常 2.主动去回滚 TransactionAspectSupport.curr ...

  5. peewee 事物 回滚

    peewee 事物 回滚 #!/usr/bin/env python # coding=utf-8 from peewee import * db = MySQLDatabase(host='123. ...

  6. C#里面的事物回滚,解决同步数据插入时出现重复数据

    什么是事物回滚: 举个栗子,你在你家的银行分行取钱,取完钱数据要同步,而且可能每个分行都有一个存储这些数据的数据库,分行的这些 存取的记录都需要实时同步,如果你取完500刚好断电了,好嘛,分行可能刚记 ...

  7. Spring-Java事物回滚失效处理

    spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因. 一切还是要从Java的检查型异常和非检查型异常说起 ...

  8. ThinkPHP数据库驱动之mysql事物回滚

    1.开启事务方法 startTrans()2.事务提交方法 commit()3.事务回滚方法 rollback() 用法例子: $order = M(‘order’); $allAdded = tru ...

  9. php数据访问:pdo用法、事物回滚功能和放sql注入功能

    PDO:    一.含义:        数据访问抽象层    二.作用        通过PDO能够访问其它的数据库    三. 用法:        1.造对象            ① $pdo ...

随机推荐

  1. c语言编写51单片机中断程序,执行过程是怎样的?

    Q:c语言编写51单片机中断程序,执行过程是怎样的? 例如程序:#include<reg52.h>  void main(void)  {   EA=1;      //开放总中断   E ...

  2. Xilinx下载方式(具体可以参考配置MCS文件时右下角help调出的doc)

    1.两者都属高速并行配置模式.SelectMAP是早期的FPGA两类配置模式之一,是相对于串行(Serial)配置而言的,与主串(Master Serial)和从串(Slave Serial)模式对应 ...

  3. linux shell自动输入实现

    1 #!/bin/sh 2  3 while read line 4 do 5         str=$line 6         var1=`echo $str|awk -F ' ' '{pri ...

  4. iOS开发常见错误(转)

    //大全 //读取数据库数据 -(void)movethesqlitefile{ NSString *sourcepath=[[NSBundle mainBundle]pathForResource: ...

  5. Python的open函数

    打开一个文件并向其写入内容 Python的open方法用来打开一个文件.第一个參数是文件的位置和文件名称.第二个參数是读写模式.这里我们採用w模式,也就是写模式.在这样的模式下,文件原有的内容将会被删 ...

  6. MapReduce源码分析之Task中关于对应TaskAttempt存储Map方案的一些思考

    我们知道,MapReduce有三层调度模型,即Job——>Task——>TaskAttempt,并且: 1.通常一个Job存在多个Task,这些Task总共有Map Task和Redcue ...

  7. python 循环内部添加多个条件判断会出现越界

    1.循环遍历数组是,想添加条件修改时,只删除第一个 # -*- coding: utf-8 -*- a=[11,22,33,44,55] for i in a: if i == 11 or i ==2 ...

  8. 理解和使用WPF 验证机制(值得推荐)

    首先建立一个demo用以学习和实验WPF Data Validation机制.创建一个数据实体类: public class Employee { public string Name { get;  ...

  9. HashMap的clear()方法和new HashMap的效率问题

    最近研究Lucene的时候,遇到的用到大量Map的问题,心生好奇,想看一下在1W,10W,100W三种数据量下,new HashMap ,与 HashMap.clear()方法的效率问题. 提前说明: ...

  10. CodeIgniter框架——源码分析之CodeIgniter.php

    CodeIgniter.php可以说是CI的核心,大部分MVC的流程都是在这个文件夹中处理的,其中加载了很多外部文件,完成CI的一次完整流程. 首先是定义了CI的版本(此处为CI 2.2.0),接下来 ...