一、锁

行级锁

  • 返回一个锁住行,值到事物结束的查询集。
  • 所有匹配的行将被锁住,直到事物结束,这就意味着可以通过锁防止数据被其他事务修改。
  • 一般情况下如果其他事务锁定了相关行,那么本查询将被阻塞直到锁被释放。

例子:

# 锁定相关行
obj = Book.objects.select_for_update().filter(name='魔道祖师') # 对满足条件的数据加上互斥锁。
# 由于mysql在查询时自动加的是共享锁,所以我们可以手动加上互斥锁。
# create、update、delete操作时,mysql自动加上行级互斥锁。

共享锁(s):一般不用加都是自加的。

select * from table_name where ... lock in share mode;

排它锁(x):我在操作这条数据别人不可以做任何操作 。

select * from table_name where ... for update;

二、事务

事务的四大特性

  1. 原子性(Atomicity)

    原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

  2. 一致性(Consistency)

    一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之后都必须处于一致性状态。

    拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次帐,事务结束后两个用户的钱加起来应该还的是5000,这就是事务的一致性

  3. 隔离性(Isolation)

    隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

    即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发执行

  4. 持久性(Durability)

    持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即使是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

全局开启

工作流程:常用的事务处理方式是将每个请求都包裹在一个事务中,当请求过来时,Django会在调用视图方法前开启一个事务。如果请求和处理都正确,就返回结果,Django就会提交该事务。否则Django会回滚该事务。

例子:对统一个http请求对应的所有sql都放在一个事务中执行(要么所有都成功,要么所有都失败),是全局性配置。

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'books',
'HOST': '127.0.0.1',
'PORT': 3306,
'USER': 'root',
'PASSWORD': '123',
'OPTIONS': {
# 配置开启严格sql模式
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
},
'ATOMIC_REQUESTS': True, # 全局开启事务,绑定的是http请求响应整个过程
'AUTOCOMMIT': False, # 全局取消自动提交(慎用)
},
# 配置其他数据库
'app01':{
'ENGINE': 'django.db.backends.oracle',
.....
}
}

在全局配置下:如果要针对某一个视图函数做不受事务的管控,可以使用non_atomic_requests装饰器。

from django.shortcuts import render
from books import models
from django.db import transaction # 需要导入 @transaction.non_atomic_requests
def index(request):
# 此代码不在事务内执行
obj = models.Books.objects.filter().values()
return render(request, 'index.html', {'obj': obj})

atomic局部使用事务

方法一:给函数做装饰器来使用

from django.shortcuts import render
from books import models
from django.db import transaction @transaction.atomic
def index(request):
# 此代码在事务内执行
obj = models.Books.objects.filter().values()
return render(request, 'index.html', {'obj': obj})

方法二:设置事务的保存点,作为上下文管理器来使用

from django.shortcuts import render
from books import models
from django.db import transaction def index(request):
# 次代码不在事务内执行
obj = models.Books.objects.filter().values() with transaction.atomic(): # 保存点
# 此代码在事务中执行
models.Books.objects.filter(id=1)
return render(request, 'index.html', {'obj': obj})

Django-ORM-事务和锁的更多相关文章

  1. Django - ORM - 事务, 乐观锁, 悲观锁

    事务 概念 Transaction 事务:一个最小的不可再分的工作单元:通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元) 一个完整的业务需要批量的DML(inser ...

  2. day056-58 django多表增加和查询基于对象和基于双下划线的多表查询聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁

    一.多表的创建 from django.db import models # Create your models here. class Author(models.Model): id = mod ...

  3. Django ORM 事务和查询优化

    一.事务操作 模块 from django.db import transaction 1 开启事务:with transaction.atomic() from django.db import t ...

  4. day058 聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁

    1.聚合(aggregate) 聚合的主要语法: from django.db.models import Avg , Max , Min , Count models.类名 .objects.all ...

  5. Django ORM 事务操作

    事务 把一些列的操作(步骤)当作一个事务 全部的步骤都成功才成功 经典例子:银行转账 代码实现: import os if name == 'main': os.environ.setdefault( ...

  6. {Django基础六之ORM中的锁和事务}一 锁 二 事务

    Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在 ...

  7. Django基础六之ORM中的锁和事务

    一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节. 返回一个锁住行直 ...

  8. day 71 Django基础六之ORM中的锁和事务

    Django基础六之ORM中的锁和事务   本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update(no ...

  9. 08.Django基础六之ORM中的锁和事务

    一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节. 返回一个锁住行直 ...

  10. day 58 Django基础六之ORM中的锁和事务

      Django基础六之ORM中的锁和事务   本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update( ...

随机推荐

  1. Spring Boot & Cloud 轻量替代框架 Solon 1.3.37 发布

    Solon 是一个微型的Java开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Micro service.WebSocket. ...

  2. 一种巧妙的使用 CSS 制作波浪效果的思路

    在之前,我介绍过几种使用纯 CSS 实现波浪效果的方式,关于它们有两篇相关的文章: 纯 CSS 实现波浪效果! 巧用 CSS 实现酷炫的充电动画 本文将会再介绍另外一种使用 CSS 实现的波浪效果,思 ...

  3. Vulkan移植GPUImage(五)从P到Z的滤镜

    现aoce_vulkan_extra把GPUImage里从P到Z的大部分滤镜用vulkan的ComputeShader实现了,也就是最后一部分的移植,整个过程相对前面来说比较简单,大部分我都是直接复制 ...

  4. 发布声明$\beta$

    一.新功能 \(\beta\)阶段集中开发了3大核心功能:支持模块的嵌套.模型市场.模型推理,这三项基本上都是从零开始.徒手开发的功能,没有轮子可以参照,因此也不具有可以对比的先前版本. 除此之外,开 ...

  5. [JavaScript之BOM与DOM]

    [JavaScript之BOM与DOM] BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". DOM ( ...

  6. 进程Queue和线程Queue区别

    进程Queue from multiprocessing import Queue q=Queue() 线程Queue import queue q=queue.Queue()

  7. Django(31)模板中常用的过滤器

    模版常用过滤器 在模版中,有时候需要对一些数据进行处理以后才能使用.一般在Python中我们是通过函数的形式来完成的.而在模版中,则是通过过滤器来实现的.过滤器使用的是|来使用. add 将传进来的参 ...

  8. curl -O http://www.linux.com/hello.sh

    2.3:可以使用curl的内置option:-O(大写)保存网页中的文件要注意这里后面的url要具体到某个文件,不然抓不下来 # curl -O http://www.linux.com/hello. ...

  9. ValueError: not enough values to unpack (expected 2, got 1)

    在python中使用字符串分片时遇到这个问题 [ValueError: not enough values to unpack (expected 2, got 1)] --------------& ...

  10. JQuery 使用教程

    引言 JQuery 是一个 JavaScript 库,它极大地简化了 JavaScript 编程.JQuery 拥有丰富的选择器,可以非常方便的获取和操作 DOM 元素,而在 JQuery 中所有选择 ...