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操作的事务管理

  • 相关阅读:
    get和post区别
    linux查看是否被入侵
    (转)MSSQL 各个发行版本版本号以及Compact 版本号
    (转)玩转-数据库行列转换
    (转)理解SQL SERVER中的分区表
    (转)使用CruiseControl+SVN+ANT实现持续集成之三
    (转)使用CruiseControl+SVN+ANT实现持续集成之二
    (转)使用SVN+CruiseControl+ANT实现持续集成之一
    (转)持续化集成工具CruiseControl.NET
    (转)DockPanel 右键增加关闭,除此之外全部关闭的功能
  • 原文地址:https://www.cnblogs.com/ly0123/p/11938516.html
Copyright © 2011-2022 走看看