首页 > 其他分享 >慎用django orm的update_or_create方法

慎用django orm的update_or_create方法

时间:2022-08-23 02:44:06浏览次数:147  
标签:create update django 死锁 html https mysql

根据错误日志,发现产生死锁的有4个接口。这4个接口中,阅读业务代码,发现均有使用update_or_create。

为什么update_or_create方法会造成死锁呢?通过阅读源码

 

 

 发现,update_or_create是使用了事务with transaction.atomic(using=self.db)并select_for_update。而mysql事务中,FOR UPDATE中的WHERE筛选语句如果有查询没有索引字段或者索引未生效,将产生表锁,否则将产生行锁(参考https://www.cnblogs.com/wangshiwen/p/9837408.html)。

  阅读事故日志4个接口的代码中使用的update_or_create中涉及到的查询,发现索引字段。因此每个接口请求将锁住业务涉及到的表,而短时间大量用户涌入造成了MySQL死锁的产生。

 参考:

https://haicoder.net/note/mysql-interview/mysql-interview-mysql-select-for-update.html

https://www.cnblogs.com/jpfss/p/9225453.html

https://www.cnblogs.com/wangshiwen/p/9837408.html

标签:create,update,django,死锁,html,https,mysql
From: https://www.cnblogs.com/bubu99/p/16614794.html

相关文章

  • Spring 循环依赖引起 This is very likely to create a memory leak 问题
    背景:在公司测试环境发布测试的时候,发布失败了。日志报错:Thisisverylikelytocreateamemoryleak 。但是奇怪的是我的本地idea是启动正常的。没问题的。然后就跟运维......
  • 2 Django-message组件
    假设:你正在做一个订单支付平台,其中用到了删除/撤销订单问题。想给予用户一些提示。可以用到Django的message组件。该组件通过第一次请求,写入提示信息并返回重定向,第二次请......
  • 清除maven残留下的".lastUpdate"文件
    maven工程中,若存在.lastUpdated文件,表示该文件下载失败并不会再重新下载,所以往往要把这种文件删除才能重新下载;以下是遍历所有本地仓库中存在的lastUpdated文件并删除 ......
  • Django 2.0 新特点
    2017年12月2日,Django官方发布了2.0版本,成为多年来的第一次大版本提升,那么2.0对广大Django使用者有哪些变化和需要注意的地方呢?一、Python兼容性Django2.0支持Python3.......
  • 关于 Knex update 语句的 where 子句出现 Undefined binding(s) detected when compil
    因为是第一次使用Knex操作数据库来开发接口,一个业务中用到了update语句,且有where子句。下图是详细的报错截图,这里保证前端一个不漏的把需要的字段都传递过来了,但还......
  • django rest framework快速使用
    一、安装相关的依赖$pipinstalldjangorestframework$pipinstallmarkdown#MarkdownsupportforthebrowsableAPI.$pipinstalldjango-filter#Filt......
  • Vulfocus靶场 | Django SQL注入(CVE-2021-35042)
    漏洞复现这题通关比较简单,但是django这个漏洞还挺出名的,之前在ctf上也遇到过相关的题目\ 直接按照提示,进入了Django报错页面 flag就在里面,直接ctrl+F就能找到......
  • django笔记
    注意:一定要使用pycharm专业版-------------------------------------------------------------------------django简介:M代表模型(Model): 负责业务对象和数据库的关系映射(O......
  • 基于django中间件的编程思想
    基于django中间件的编程思想在django中,中间件的形式全部写成了列表套字符串的形式MIDDLEWARE=['django.middleware.security.SecurityMiddleware','django.c......
  • django中的中间件
    1.什么是中间件中间件是django的门户,在请求响应进入进出django的时候,都需要先经过中间件,用来全局改变django的输入和输出。django中自带7个中间件,每个中间件都有其特定......