• Django【九】事务和锁


    一、事务

    1、全局开启事务

    在Web应用中,常用的事务处理方式是将每个请求都包裹在一个事务中。这个功能使用起来非常简单,你只需要将它的配置项ATOMIC_REQUESTS设置为True。

    它是这样工作的:当有请求过来时,Django会在调用视图方法前开启一个事务。如果请求却正确处理并正确返回了结果,Django就会提交该事务。否则,Django会回滚该事务。

    复制代码
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'mxshop',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'USER': 'root',
            'PASSWORD': '123',
            'OPTIONS': {
                "init_command": "SET default_storage_engine='INNODB'",
           #'init_command': "SET sql_mode='STRICT_TRANS_TABLES'", #配置开启严格sql模式
    
    
            }
            "ATOMIC_REQUESTS": True, #全局开启事务,绑定的是http请求响应整个过程
            # "AUTOCOMMIT":False, #全局取消自动提交,慎用
        },
      'other':{
        'ENGINE': 'django.db.backends.mysql', 
                ......
      } #还可以配置其他数据库
    }
    复制代码

    2、局部使用事务

    原子性是数据库事务的一个属性。使用atomic,我们就可以创建一个具备原子性的代码块。一旦代码块正常运行完毕,所有的修改会被提交到数据库。反之,如果有异常,更改会被回滚。

    被atomic管理起来的代码块还可以内嵌到方法中。这样的话,即便内部代码块正常运行,如果外部代码块抛出异常的话,它也没有办法把它的修改提交到数据库中。

    用法1:给函数做装饰器来使用

    from django.db import transaction
    
    @transaction.atomic
    def viewfunc(request):
        # This code executes inside a transaction.
        do_stuff()

    用法2:作为上下文管理器来使用,其实就是设置事务的保存点

    复制代码
    from django.db import transaction
    
    def viewfunc(request):
        # This code executes in autocommit mode (Django's default).
        do_stuff()
    
        with transaction.atomic():   #保存点
            # This code executes inside a transaction.
            do_more_stuff()
    
        do_other_stuff()
    复制代码

    二、锁

    select_for_update()
    select * from t1  for update
    models.T1.objects.select_for_update().filter(id=1)  #排他锁(互斥锁)  读写不行写也不行

    三、MySQL中加锁和事务

    MySQL默认自动commit,
    验证锁,先把自动commit取消;

    事务:

    开启一个事务,必须我们手动commit,这个事务才会结束:

  • 相关阅读:
    hadoop 执行python 注意的地方
    ADOBE FLASH BUILDER 4.6 IOS 开发之离线地图
    ADOBE FLASH BUILDER 4.6 IOS 开发之地图控件
    Flex 4.6 ADT 工具编译异常
    Web中的广告组件(幻灯片组件)实现
    [译]《学习HTML5游戏编程》第二章
    自适应两栏布局的最简实现
    [译]InfoQ1205
    [译]《学了HTML5游戏编程》前言
    [译]InfoQ1201
  • 原文地址:https://www.cnblogs.com/youxiu123/p/11600536.html
Copyright © 2020-2023  润新知