Django数据库补充之事务

往数据库写入数据时,如果写入了不完整的数据,我们称之为脏数据。事务管理(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=‘[email protected]‘)
                dept_obj = models.Dept.objects.create(title=‘IT‘)
        except Exception as e:
            return HttpResponse(‘error happened, db rollback‘)
    
        return HttpResponse(‘OK‘)
  4. 说明:
    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引擎就是支持的。

原文地址:https://www.cnblogs.com/mjc69213/p/9941059.html

时间: 2024-10-28 18:35:48

Django数据库补充之事务的相关文章

Django 数据库事务

管理数据库事务 Django框架提供了好几种方式来控制和管理数据库事务.(以下Django框架会简化为Django,读者可自行脑补框架两字) Django框架默认的事务行为 自动提交作为Django默认的事务行为,它表现形式为:每次数据库操作会立即被提交到数据库中,除非这个事务仍然处于激活状态. 那么,更多详细内容见下文. Django使用事务或者保存点来保证多个ORM操作的完整性,尤其是针对delete()和update()操作. 另外因为某些性能原因,Django提供的TestCase类就将

07: Django 学习补充

目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:ModelForm 数据验证 & 生成html & 数据库操作 06: Django Admin 07: Django 学习补充 1.1 待补充

MySQL数据库引擎、事务隔离级别、锁

MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行效率比InnoDB类型更快,但是不支持事务,而InnoDB提供事务支持以及外键等高级数据库功能. 具体实现的区别: InnoDB不支持FULLTEXT类型的索引 InnoDB中不保存表的具体行数,也就是说,执行查询SQL时,InnoDB要扫描一遍整个表来计算有多少行,而MyISAM只要简单的

Django的锁和事务

Django的锁和事务 锁 select_for_update(nowait=False, skip_locked=False) 返回一个锁住行直到事务结束的查询集,如果数据库支持,它将生成一个 SELECT ... FOR UPDATE 语句. 举个例子: entries = Entry.objects.select_for_update().filter(author=request.user) 所有匹配的行将被锁定,直到事务结束.这意味着可以通过锁防止数据被其它事务修改. 一般情况下如果其

SharePoint 2010 数据库xxx的事务日志已满

http://www.cnblogs.com/sygwin/p/6222428.html 接到领导安排,说客户有问题 请求协助解决,对方给我展示的错误日志,如下: 数据库'WSS_Content_xxxx'的事务日志已满.若要查明无法重用日志中的空间的原因,请参阅sy.databases中的log_reuse_wait_dec列 导致的结果是用户再也无法上传文件到文档库了. 看来一下对应的数据库文件,日志文件大的惊人,已经超过1.8T 作为老司机,理论上解决这样的问题,就是收缩数据库.可是咱是个

数据库中的事务和并发问题探讨

数据库中的事务和并发问题探讨 引子 最近有同事写了段代码,负责创建订单的逻辑,代码审查时发现可能会有并发的问题.同事并不认同,他认为他的逻辑是写在存储过程中的,应该没有问题. 代码的逻辑大概是(伪代码): begin transaction if 查询到客户存在进行中的订单 rollback transaction if 查询到设备存在进行中的订单 rollback transaction 插入订单 commit transaction 下面针对这个逻辑进行分析,为什么这个事务会出现并发问题.

django数据库中的时间格式与页面渲染出来的时间格式不一致的处理

django数据库中的时间格式与页面渲染出来的时间格式不一致的处理. 在数据库里,时间是这样显示的: date: 2012-07-21 12:27:22 | date | datetime | NO | | NULL | | +-----------+-------------+------+-----+---------+----------------+ 在模板里用: <span>{{ post.date }}</span> 打印出来,时间格式是这样的: July 21, 20

MySql数据库并发和事务资料汇总

InnoDB多版本并发控制-MVCC http://my.oschina.net/xinxingegeya/blog/208821 MySql并发控制 http://my.oschina.net/xinxingegeya/blog/215417 MySQL之事务 http://my.oschina.net/xinxingegeya/blog/215419 MySql命令行控制事务 http://my.oschina.net/xinxingegeya/blog/296459 MySQL事务隔离级别

数据库学习之事务控制

事务概述: 1.事务是数据库并发控制和恢复技术的基本单位: 2.事务具有四个特性,分别是:原子性,一致性,隔离性,持久性: 3.事务是一些数据库操作的集合,由一组相关的SQL语句组成: Oracle事务的隔离级别: Oracle数据库为事务提供了两个级别的隔离. 1.read commited: (1)每个事务所执行的查询操作只能获取在该查询开始之前(不是该事务开始之前)已经提交的数据. (2)可以防止丢失修改和脏读的问题,但是不能防止不可重复读的问题. (3)若数据被加锁则等待其他事务解锁: