Django中管理并发操作
上一篇我们说了,如何在Django中进行事务操作,数据的原子性操作
涉及了事务操作,我们不得不考虑的另一个问题就是:并发操作
还是那个用户转账的操作
我们使用事务操作解决的操作中途服务器宕机问题
但是,如果有两条请求同时修改一条记录该怎么办?
我们可以使用select_for_update函数
select_for_update使用的是悲观锁
使用select_for_update内部执行的sql语句就是select...for update
具体用法:
models.UserInfo.objects.select_for_update().get()
注意:一定要让select_for_update在同一个事务中
如果做的是金融的话建议还是使用悲观锁,这个会更加安全
关于乐观锁
乐观锁的出发点是:同一条数据很少会因为并发修改而产生冲突,适用于读多写少的操作,用以提高吞吐量
实现方式:
读取一个字段,执行处理逻辑,当需要更新数据的时候,再次检查该字段是否和第一次读取的一致。如果一致,则更新数据。否则拒绝更新,重新读取后再提交
乐观锁与悲观锁的比较
悲观锁可能会导致死锁的发生
当A锁定了a资源,需要b资源。而b资源又被B锁定了,正在等待a资源。此时就导致了死锁。我们一般通过设置超时时间来处理这个问题。
悲观锁可以有效的降低冲突后,重试的次数
乐观锁可以提高响应速度
Django中管理并发操作的更多相关文章
- 如何在Django模型中管理并发性 orm select_for_update
如何在Django模型中管理并发性 为单用户服务的桌面系统的日子已经过去了 - 网络应用程序现在正在为数百万用户提供服务,许多用户出现了广泛的新问题 - 并发问题. 在本文中,我将介绍在Django模 ...
- 如何在 Django 中保证并发的数据一致性
1. 关于锁 1.1 乐观锁 乐观锁的出发点是,同一条数据很少会因为并发修改而产生冲突,适用于读多写少的场景,用以提高吞吐量. 实现方式,读取一个字段,执行处理逻辑,当需要更新数据时,再次检查该字段是 ...
- Django中的模型(操作数据库)
目录 Django配置连接数据库 在Django中操作数据库 原生SQL语句操作数据库 ORM模型操作数据库 增删改查 后台管理 使用后台管理数据库 模型是数据唯一而且准确的信息来源.它包含您正在储存 ...
- 关于Django中的数据库操作API之distinct去重的一个误传
转载自http://www.360doc.com/content/18/0731/18/58287567_774731201.shtml django提供的数据库操作API中的distinct()函数 ...
- Django中Model进阶操作
一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 pr ...
- Django中的分页操作、form校验工具
批量插入数据 后端: def fenye(request): book_list=[] for i in range(100): book_list.append(models.Book(title= ...
- .NET中的并发操作集合
更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月1日. 一.并发集合 .NET中提供了相当多线程安全的集合,它们都在System.Collections.Concurrent命名 ...
- Django 中使用 js 操作 cookies
session与cookie对比 Cookie: 保存在用户浏览器端的键值对 本地可以修改:如果有敏感信息,可以被看到 Session: 保存在服务器端的键值对 服务端:保存键值对{'随机字符串':{ ...
- Django中查询相关操作
查询集特性 1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询. 2)缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个 ...
随机推荐
- linux每天一小步---grep命令详解
1 命令功能 grep(global regular expression print全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. g ...
- visual studio 2013 git 记住密码
原有配置: C:\Users\Administrator 下.gitconfig内容为 [user] name = lijf4 email = lijf4@lenovo.com 删除,修改为 [cre ...
- 用 Servlet 进行上载的原理和实现
Servlet 是用 Java 编写的.协议和平台都独立的服务器端组件,使用请求/响应的模式,提供了一个基于 Java 的服务器解决方案.使用 Servlet 可以方便地处理在 HTML 页面表单中提 ...
- HttpServletRequest介绍
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息. 二 ...
- GlusterFS 一
GlusterFS 一 1 安装源 yum install centos-release-gluster312.noarch 列出所有可用安装包yum list gluster* 安装glusterf ...
- c# 后台GET、POST、PUT、DELETE传输发送json数据
一.Get 方式传输 //url为请求的网址,param参数为需要查询的条件(服务端接收的参数,没有则为null) //返回该次请求的响应 public string HttpGet(string u ...
- UWP开发入门(十)——通过继承来扩展ListView
本篇之所以起这样一个名字,是因为重点并非如何自定义控件,不涉及创建CustomControl和UserControl使用的Template和XAML概念.而是通过继承的方法来扩展一个现有的类,在继承的 ...
- 云捕Redis实战
本文由作者余宝虹授权网易云社区发布. Redis是一个支持丰富数据结构的分布式key-value系统,Redis在云捕系统的地位相当重要,碰到的问题也比较多,最近才解决了一个遗留的老大难问题.由于15 ...
- iOS 添加 Watch OS 1 应用后无法运行 An error was encountered while running (Domain = LaunchServicesError, Code = 0)
在 iOS 应用基础上我添加了一个 Watch OS 2 应用,运行良好.又加了一个 Watch OS 1 应用,然后就所有 Target 都不能运行了. 运行时说 An error was enco ...
- Ceph 的基础数据结构 [Pool, Image, Snapshot, Clone]
原文链接:http://www.cnblogs.com/sammyliu/p/4843812.html?utm_source=tuicool&utm_medium=referral 1 Poo ...