一、锁

行级锁

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

例子:

# 锁定相关行
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. 操作系统中的进程同步与Window中利用内核对象进行线程同步的关系

    操作系统中为了解决进程间同步问题提出了用信号量机制,信号量可分为四种类型分别是互斥型信号量,记录型信号量,AND型信号量,信号量集. 互斥型信号量 互斥型信号量是资源数量为1的特殊的记录型信号量.表示 ...

  2. Element ui结合springboot的简单实战

    Eelment UI简单实战 前端开发 1 创建项目,导入element ui(略) 2 大致设计出想要的效果,如下 3 创建包 根据设计的大致模样在项目的components中创建对应的包,方便以后 ...

  3. 简单聊聊内存逃逸 | 剑指offer - golang

    问题 简单讲讲golang的内存逃逸吗? 解析 什么是内存逃逸 在程序中,每个函数块都会有自己的内存区域用来存自己的局部变量(内存占用少).返回地址.返回值之类的数据,这一块内存区域有特定的结构和寻址 ...

  4. 10.27-Redis-mz 深入浅出Redis

    深入浅出Redis 1.Redis的发展史     Redis[Remote Directory Server]:远程服务器字典 2.下载安装Redis 1>Linux下安装Reids     ...

  5. STM32的VDD与VDDA

    http://bbs.21ic.com/icview-1651072-1-1.html VDD VSS 就是平常的电源与地.后面带A的都是模拟量的电源.

  6. redis 基本操作命令

    redis 基本操作 String 操作字符串 1 SET key value 设置指定 key 的值 ​ 2 GET key 获取指定 key 的值. ​ 3 GETRANGE key start ...

  7. WEB页面下载内容导出excel

    internal class DownloadHandler : IDownloadHandler    {        public DownloadHandler()        {      ...

  8. Django使用Ace实现在线编辑器

    前言:最近自己开发SQL工单功能,期间接触到了Ace在线编辑器,折腾一下,感觉功能挺多,特意去了解学习一下分享跟大家. ACE 是一个功能非常强大的编辑器,实现语法高亮.代码补全功能,还有很多主题,支 ...

  9. ASP.Net Core5.0 EF Core使用记录

    打算把之前开源的 基于ASP.Net Core开发一套通用后台框架 重新用ASP.Net Core 5写一遍,也算是巩固一下旧知识,学习下新知识.本文是项目搭建初期关于 EF Core 的使用记录 1 ...

  10. C# MVC(File)控件多张图片上传加预览

    刚来公司实习,老板叫我写一个积分商城网站.用的是公司的框架结构搭建的后台,所以后台的图片上传不需要自己写.但是前台的评价图片就需要自己手写了,在网上找了很多代码发现都用不了.问了很多人也都没有实现! ...