Django-ORM-事务和锁
一、锁
行级锁
- 返回一个锁住行,值到事物结束的查询集。
- 所有匹配的行将被锁住,直到事物结束,这就意味着可以通过锁防止数据被其他事务修改。
- 一般情况下如果其他事务锁定了相关行,那么本查询将被阻塞直到锁被释放。
例子:
# 锁定相关行
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;
二、事务
事务的四大特性
原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次帐,事务结束后两个用户的钱加起来应该还的是5000,这就是事务的一致性
隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发执行
持久性(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-事务和锁的更多相关文章
- Django - ORM - 事务, 乐观锁, 悲观锁
事务 概念 Transaction 事务:一个最小的不可再分的工作单元:通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元) 一个完整的业务需要批量的DML(inser ...
- day056-58 django多表增加和查询基于对象和基于双下划线的多表查询聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁
一.多表的创建 from django.db import models # Create your models here. class Author(models.Model): id = mod ...
- Django ORM 事务和查询优化
一.事务操作 模块 from django.db import transaction 1 开启事务:with transaction.atomic() from django.db import t ...
- day058 聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁
1.聚合(aggregate) 聚合的主要语法: from django.db.models import Avg , Max , Min , Count models.类名 .objects.all ...
- Django ORM 事务操作
事务 把一些列的操作(步骤)当作一个事务 全部的步骤都成功才成功 经典例子:银行转账 代码实现: import os if name == 'main': os.environ.setdefault( ...
- {Django基础六之ORM中的锁和事务}一 锁 二 事务
Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在 ...
- Django基础六之ORM中的锁和事务
一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节. 返回一个锁住行直 ...
- day 71 Django基础六之ORM中的锁和事务
Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update(no ...
- 08.Django基础六之ORM中的锁和事务
一 锁 行级锁 select_for_update(nowait=False, skip_locked=False) #注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节. 返回一个锁住行直 ...
- day 58 Django基础六之ORM中的锁和事务
Django基础六之ORM中的锁和事务 本节目录 一 锁 二 事务 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 锁 行级锁 select_for_update( ...
随机推荐
- 克鲁斯卡尔(Kruskal)算法(代码)
算法代码 C#代码 using System; using System.Linq; namespace Kruskal { class Program { static void Main(stri ...
- queryset惰性与缓存
https://blog.csdn.net/zhu6201976/article/details/83550461
- 『动善时』JMeter基础 — 18、JMeter配置元件【计数器】
目录 1.计数器介绍 2.计数器界面详解 3.计数器的使用 (1)测试计划内包含的元件 (2)线程组界面内容 (3)计数器界面内容 (4)HTTP请求界面内容 (5)查看结果 1.计数器介绍 如果需要 ...
- ubuntu下载安装软件并创建图标
本列以安装webstorm软件 1.官网下载软件的压缩包 2.解压 umlinux@umlinux-PC:~/idea$ tar -zxvf ideaIU-2020.3.1.tar.gz 3.找到we ...
- 都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术
在大数据项目开发过程中,ETL(Extract-Transform-Load)是必不可少.即便目前 JSON 非常流行,开发人员也有必定会有对远古系统的挑战,而 XML 格式的数据源作为经典存在浑身上 ...
- istioctl命令整理
显示配置文件中的差异 istioctl profile diff default demo 显示对应配置的profile istioctl profile dump demo 显示可用的配置 isti ...
- [刷题] 75 Sort Colors
要求 给只有0 1 2三个元素的数组排序 思路 方法1:遍历数组,利用辅助数组保存三个元素的个数,再写入(遍历两遍) 辅助数组有三个元素,对应0 1 2的个数 方法2:模拟三路快排,遍历一遍完成排序 ...
- Docker Swarm(十一)生产环境使用的一些建议
一.Docker Swarm上的容器选择 并非所有服务都应该部署在Swarm集群内.数据库以及其他有状态服务就不适合部署在Swarm集群内. 理论上,你可以通过使用labels将容器部署到特定节点上, ...
- Docker Swarm(五)Config 配置管理
前言 在动态的.大规模的分布式集群上,管理和分发配置文件也是很重要的工作.传统的配置文件分发方式(如配置文件放入镜像中,设置环境变量,volume 动态挂载等)都降低了镜像的通用性. Docker 1 ...
- 067.Python框架Django之DRF视图类
一 关于视图类的一下概念 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. ...