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()
    
  • 相关阅读:
    单据体内2个字段比较
    立账模式
    余额
    单据服务校验设置
    值更新事件(触发带基础属性到指定字段)
    重建索引 ,压缩数据库
    数据库自动备份
    BZOJ 4597: [Shoi2016]随机序列 线段树 + 思维
    BZOJ 4399: 魔法少女LJJ 线段树合并 + 对数
    BZOJ 2217: [Poi2011]Lollipop 构造 + 思维
  • 原文地址:https://www.cnblogs.com/zdqc/p/11756117.html
Copyright © 2011-2022 走看看