码迷,mamicode.com
首页 > 数据库 > 详细

Django数据库补充之事务

时间:2017-10-19 10:25:15      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:cti   也会   回滚   end   style   pattern   objects   容错   render   

  往数据库写入数据时,不经意间就会写入不完整的数据,我们称之为脏数据。事务管理(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数据库补充之事务

标签:cti   也会   回滚   end   style   pattern   objects   容错   render   

原文地址:http://www.cnblogs.com/78pikaqiu/p/7690678.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!