首页 > 其他 > 详细

Django-事务和锁

时间:2021-05-31 21:21:12      阅读:28      评论:0      收藏:0      [点我收藏+]

一、事务、

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):
    do_stuff()

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

from django.db import transaction

def viewfunc(request):
    do_stuff()

    with transaction.atomic():   #保存点,加锁点
        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,这个事务才会结束:

技术分享图片

 

Django-事务和锁

原文:https://www.cnblogs.com/zhuxibo/p/14833113.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!