• orm事务与锁


    mysql:  select * from book where id=1 for update;
    
    begin;  start transaction;
    	select * from t1 where id=1 for update;
    commit
    
    rollback;
    
    
    django orm
    	models.Book.objects.select_for_update().filter(id=1)
    
    entries = Entry.objects.select_for_update().filter(author=request.user)  #加互斥锁,由于mysql在查询时自动加的是共享锁,所以我们可以手动加上互斥锁。create、update、delete操作时,mysql自动加行级互斥锁
    

    事务

    1,全局开启

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

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

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

    • DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',
              'NAME': 'hello',
              '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(using=None, savepoint=True)[source] ,参数:using='other',就是当你操作其他数据库的时候,这个事务才生效,看上面我们的数据库配置,除了default,还有一个other,默认的是default。savepoint的意思是开启事务保存点

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

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

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

    3,上下文管理器来使用,其实就是设置事务的保存点

    • 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()
      
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    (55)ElasticSearch之使用scroll滚动技术实现大数据量搜锁
    (54)ElasticSearch之DocValues解析
    (53)ElasticSearch之如何计算相关度分数
    HDU
    POJ3311 Hie with the Pie
    luoguP2768: 珍珠项链(矩阵乘法优化DP)
    luoguU60884 【模板】动态点分治套线段树
    最小圆覆盖(洛谷 P1742 增量法)
    CodeForces
    HDU
  • 原文地址:https://www.cnblogs.com/daviddd/p/12050915.html
Copyright © 2020-2023  润新知