一、锁

行级锁

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

例子:

# 锁定相关行
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. Js的变量、作用域与内存

    变量.作用域与内存 1 .原始值与引用值 Undefined.Null.Boolean.Number. String和Symbol.保存原始值的变量是按值(by value)访问的 引用值是保存在内存 ...

  2. blazor发布之后 刷新404的解决方法

    其实所有单页面应用都一样 只需要在nginx里面配置 location / { root html; index index.html index.htm; rewrite ^/.*/$ / last ...

  3. 简单介绍下自动化框架:Robot Framework

    一.简介: Robot Framework:Robot Framework是由Python编写的一款功能丰富并且扩展性强的自动化测试框架,也可以在Java和 .NET 上运行. HttpRunner: ...

  4. 面试 CSS篇清除浮动及display:inline-block

    一. 在div使用display:inline-block时,HTML代码中的回车换行键会被转化为一个空白符 如图 <style type="text/css"> *{ ...

  5. path自定义转换器

    register-converter用于注册转换器

  6. 前端的MySQL基础

    前端MySQL 一.引言 MySQL是一个关系型数据库管理系统,在Web应用方面,MySQL是最好的应用之一.其主要的他点是体积小.速度块.总体成本低.源码开放 二.MySQL的构成 在我们开始学习M ...

  7. ES6中的Set和Map对象数据结构

    set对象数据结构 构建某一类型的对象 -对象的实例化 let arr = [1, 2, 3, 3, 4, 5] let rec = new Set(arr)//可以传参数,数组或者对象 consol ...

  8. [bug] IDEA:application context not configured for this file

    参考 https://blog.csdn.net/a772304419/article/details/79680833

  9. python 运算及注释

    """ 上面的两行代码,在2.0的python中,若想执行含有汉字的代码,是必不可少的,且两行代码必写在单个py文件最上方,之间不可有任何字节.且该两行代码,可在pych ...

  10. xrandr 直接输这个能显示可用的分辨和当前的分辨率 xrandr -s 1920x1200就设置成指定的分辨率

    利用 xrandr 命令修改屏幕分辨率 时间  2016-10-29 原文   http://blog.csdn.net/mao0514/article/details/52965700   问题背景 ...