zoukankan      html  css  js  c++  java
  • orm的锁和事务

    一.锁

    mysql中的加锁,不会防止其他用户的查询,会防止其他用户的增删改操作。

    entries = Entry.objects.select_for_update().filter(author=request.user) #所有匹配的行将被锁定,直到事务结束
    select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面
    目前,postgresql,oracle和mysql数据库后端支持select_for_update()。 但是,MySQL不支持nowait和skip_locked参数。

    二.事务

    1.全局开启

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

    这个功能使用起来非常简单,你只需要将它的配置项ATOMIC_REQUESTS设置为True。

    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, #全局取消自动提交,慎用
        },
    }
    

      上面这种方式是统一个http请求对应的所有sql都放在一个事务中执行(要么所有都成功,要么所有都失败)。是全局性的配置, 如果要对某个http请求放水(然后自定义事务),可以用non_atomic_requests修饰器,那么他就不受事务的管控了

    from django.db import transaction
    
    @transaction.non_atomic_requests
    def my_view(request):
        do_stuff()
    
    @transaction.non_atomic_requests(using='other')
    def my_other_view(request):
        do_stuff_on_the_other_database()
    使用non_atomic_requests修饰,不建议使用

    2.局部使用事务

    原子性是数据库事务的一个属性。使用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.
         entries = Entry.objects.select_for_update().filter(author=request.user) #会锁住所有匹配的行,直到事务结束
            entries.update(xxx) #当有两个用户同时来访问时,可能会查询到相同的结果(相当于2个线程),但是后进来的数据不会执行更删改操作,直到第一个事务结束
     do_other_stuff()

    transaction只对数据库层的操作进行事务管理,不能理解为python操作的事务管理

  • 相关阅读:
    有点忙啊
    什么是协程
    HDU 1110 Equipment Box (判断一个大矩形里面能不能放小矩形)
    HDU 1155 Bungee Jumping(物理题,动能公式,弹性势能公式,重力势能公式)
    HDU 1210 Eddy's 洗牌问题(找规律,数学)
    HDU1214 圆桌会议(找规律,数学)
    HDU1215 七夕节(模拟 数学)
    HDU 1216 Assistance Required(暴力打表)
    HDU 1220 Cube(数学,找规律)
    HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)
  • 原文地址:https://www.cnblogs.com/ly0123/p/11938516.html
Copyright © 2011-2022 走看看