django autocommit的一个坑,读操作的事务占用导致锁表
版权归作者所有,任何形式转载请联系作者。
作者:petanne(来自豆瓣)
来源:https://www.douban.com/note/580618150/
缘由:有一个django守护进程Daemon一直在后台运行,轮询读数据库,导致被锁无法ALTER表结构。
涉及django==1.4 django==1.9 mysql
在1.4中(1.5之前版本均为这样),默认的transaction为autocommit,在读写数据库时,均会对数据表产生一个状态为RUNNING的事务,写操作在save的时候会触发autocommit,结束该事务,但是读操作不会触发autocommit,导致该事务一直RUNNING,并且不能对表结构进行操作。
注:1.6之前的autocommit只对写操作有效,对读操作无效!
注:1.6之前的autocommit只对写操作有效,对读操作无效!
注:1.6之前的autocommit只对写操作有效,对读操作无效!
先看看这个很有趣的例子,复现方式:
1.在django的python shell 环境下执行一条读语句
python manage.py shell
>>User.objects.get(id=1)
<User: xxxxx>
2.在mysql shell里执行
>>use information_schema;
>>select * from INNODB_TRX \G;
此时,可以看到有一个RUNNING的事务
>>show processlist;
此时,可以看到process里有一个Id字段为上面事务的trx_mysql_thread_id的process,然后看该process的Host字段(通信的客户端IP和端口),可以确定此事务即为1步骤读操作占用。
3.退出1中的python shell,可发现2中RUNNING的事务被结束。
也就是说,守护进程Daemon一直运行不退出的话,只要里面有读操作,就会因为事务占用一直锁住这个表。同理,每次web请求,使用ORM读的时候,也是这样,但web请求结束django关掉数据库连接,就会结束该事务。
解决方法:
在django==1.5版本之前,在Daemon里每次执行完读操作后,都手动commit一下
方法1:
>>from django.db import transaction
>>User.objects.get(id=1)
>>transaction.commit()
方法2:将查询语句置于事务管理commit_on_success的block下,顾名思义,其作用为在block中的代码执行完毕且无Exception的时候自动commit
>>with transaction.commit_on_success():
User.objects.get(id=1)
django==1.6版本,在settings.py的数据库配置项DATABASES中,添加了"AUTOCOMMIT"参数,默认为True,详见文档https://docs.djangoproject.com/en/dev/ref/settings/#autocommit,即为所有操作自动提交。
另外注意在1.6 至 1.6.2版本中,该参数有BUG,会导致AUTOCOMMIT不生效,django在1.6.2版本fix了该BUG,详见https://docs.djangoproject.com/en/1.10/releases/1.6.2/
django autocommit的一个坑,读操作的事务占用导致锁表的更多相关文章
- Hiver 操作 MySQL 导致锁表
Hadoop 搬迁到新集群后,操作主库 MySQL 导致了锁表...sad 具体锁表时间点 : 2016-1-14 14:31 到 2016-1-14 14:36 之间 在 oradba 的 ...
- mysql批量update操作时出现锁表
https://www.cnblogs.com/wodebudong/articles/7976474.html 最近遇到一件锁表的情况,发现更新的语句where检索的字段,没有建索引,且是批量操作的 ...
- LSM树——LSM 将B+树等结构昂贵的随机IO变的更快,而代价就是读操作要处理大量的索引文件(sstable)而不是一个,另外还是一些IO被合并操作消耗。
Basic Compaction 为了保持LSM的读操作相对较快,维护并减少sstable文件的个数是很重要的,所以让我们更深入的看一下合并操作.这个过程有一点儿像一般垃圾回收算法. 当一定数量的ss ...
- django中static的坑
在django搭建网络平台的时候免不了要使用到static来保存静态文件, 在static文件夹里包含两个文件:css和js文件,如果使用不当就会出现很多问题 第一个坑:配置文件settings.py ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- NoSql数据库初探-mongoDB读操作
MongoDB以文档的形式来存储数据,此结果类似于JSON键值对.文档类似于编程语言中将键和值关联起来的结构(比如:字典.Map.哈希表.关联数组).MongoDB文档是以BOSN文档的形式存在的.B ...
- 困扰多日的C#调用Haskell问题竟然是Windows的一个坑
最近一直被C#调用Haskell时的“尝试读取或写入受保护的内存”问题所困扰(详见C#调用haskell遭遇Attempted to read or write protected memory,C# ...
- CI中获取读操作的结果集行数+获取写操作的影响行数
本质:读操作,用mysql_num_rows函数,写操作用mysql_affected_rows函数 mysql_num_rows() 返回结果集中行的数目.此命令仅对 SELECT 语句有效.要取得 ...
- 怎么看时序图--nand flash的读操作详解(转载)
出处:http://blog.chinaunix.net/uid-28852942-id-3992727.html这篇文章不是介绍 nand flash的物理结构和关于nand flash的一些基本知 ...
随机推荐
- 解决xcode5升级后,Undefined symbols for architecture arm64:问题
The issue is that the cocoapods have not been built for arm64 architecture yet thus they cannot be l ...
- Java 学习 day07
01-面向对象(继承-概述).avi package myFirstCode; /* 将学生和工人的共性描述提取出来,单独进行描述, 只要让学生和工人与单独描述的这个类有关系,就可以了. 继承: 1. ...
- 【HTML5开发系列】CSS3
选择器 属性 背景和边框 盒模型 布局 文本 动画 其他
- POJ 1845-Sumdiv【经典数学题目---求因子和】
转载请注明出处:http://blog.csdn.net/lyy289065406/article/details/6648539 優YoU http://user.qzone.qq.com/289 ...
- 9.接口BeanPostProcessor
package org.springframework.beans.factory.config; import org.springframework.beans.BeansException; p ...
- iOS 微信支付点击左上角返回解决方案
在网了搜了一些解决方案,感觉并不是那么严谨,于是自己动手搞了一下,直接说思路 iOS调起第三方支付和安卓还不一样,安卓是把第三方的支付SDK直接镶嵌在自己的App中,而iOS由于沙盒机制,各个应用之间 ...
- CF1060 E-Sergey and Subway
题目戳这里 一句话题意 一棵树,任意相隔一个点的两个点连一条新边(原边留下),问所有点对的距离之和. Solution 本来看见是黑题有点怕,但仔细一想也没有那么难. 先处理出每个点的深度(dep)和 ...
- Redis的主从同步手动执行故障切换
1.准备三个redis配置文件,通过端口的区分,启动三个redis数据库实例,然后配置主从复制. # a6371.conf port 6371 daemonize yes pidfile /data/ ...
- codeforces Gravity Flip 题解
版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...
- 使用apt-get 安装后的mysql 登录问题
当使用apt-get安装mysql后,ubuntu会自动生成一个用户名和密码.所以在第一次登陆时会报如下错误 ERROR 1045 (28000): Access denied for user 'd ...