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

    sql语句加锁

    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)
    

    全局事务

        在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', 
                ......
      } #还可以配置其他数据库
    }
    
    

    局部事务

    用法1

    视图中所有的orm都加上了事务

    from django.db import transaction
    
    @transaction.atomic
    def viewfunc(request):
    	pass              #此视图中所有的orm都加上了事务
    

    用法2:

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

    视图的某个部分使用

    from django.db import transaction
    
    def viewfunc(request):
    
        do_stuff()
    
        with transaction.atomic():   #保存点
            
            do_more_stuff()
    
        do_other_stuff()
    

    用法3:还可以嵌套使用,函数的事务嵌套上下文管理器的事务,上下文管理器的事务嵌套上下文管理器的事务等。下面的是函数嵌套上下文的例子:

    from django.db import IntegrityError, transaction
    
    @transaction.atomic
    def viewfunc(request):
        create_parent()
    
        try:
            with transaction.atomic():
                generate_relationships()
           #other_task()  #还要注意一点,如果你在事务里面写了别的操作,只有这些操作全部完成之后,事务才会commit,也就是说,如果你这个任务是查询上面更改的数据表里面的数据,那么看到的还是事务提交之前的数据。
        except IntegrityError:
            handle_exception()
    
        add_children()
    
  • 相关阅读:
    【Codechef】Chef and Bike(二维多项式插值)
    USACO 完结的一些感想
    USACO 6.5 Checker Challenge
    USACO 6.5 The Clocks
    USACO 6.5 Betsy's Tour (插头dp)
    USACO 6.5 Closed Fences
    USACO 6.4 Electric Fences
    USACO 6.5 All Latin Squares
    USACO 6.4 The Primes
    USACO 6.4 Wisconsin Squares
  • 原文地址:https://www.cnblogs.com/zdqc/p/11756117.html
Copyright © 2011-2022 走看看