MySQLdb autocommit的坑

今天写的一个小功能,里面要用MySQLdb更新数据库,语句如下

sql = "update %s.account_operation set status=1 where username='%s'" % (allResDBInfos['db'], username)

  

变量替换后,是下面的样子

update suspects.account_operation set status=1 where username='test@163.com'

  

语句没问题,数据库中也存在username为'test@163.com'的记录,并且手动执行也是正确的(status被正确的更新为1)

但奇怪的就是在Python中用MySQLdb更新的时候没有效果

原因就是suspects.account_operation这张表用的InnoDB引擎,InnoDB是事务性引擎,有个autocommit的变量控制是否自动提交事务。InnoDB默认的autocommit=1,也就是说,每条语句都是一个事务,都会被自动提交。但如果设置autocommit=0,关闭自动提交的话,就需要我们手动commit了。commit之前的所有更新都在一个事务内,如果不commit的话,这些更新都不会生效。

 

用MySQL的客户端连接时,autocommit=1,是会自动提交的。有意思的是,MySQLdb这个库默认autocommit=0,所以需要手动提交。

下面是MySQLdb的关于autocommit的说明,从1.2.0版本开始,默认禁用autocommit。

链接:http://mysql-python.sourceforge.net/FAQ.html#my-data-disappeared-or-won-t-go-away

My data disappeared! (or won't go away!)

Starting with 1.2.0, MySQLdb disables autocommit by default, as required by the DB-API standard (PEP-249). If you are using InnoDB tables or some other type of transactional table type, you'll need to do connection.commit() before closing the connection, or else none of your changes will be written to the database.

Conversely, you can also use connection.rollback() to throw away any changes you've made since the last commit.

Important note: Some SQL statements -- specifically DDL statements like CREATE TABLE -- are non-transactional, so they can't be rolled back, and they cause pending transactions to commit.

 

上面这些内容都是针对InnoDB的,对于MyISAM这样的非事务性引擎,不存在事务概念,只管更新即可,autocommit是0或1都没有影响。

转载于:https://www.cnblogs.com/truezion/p/4383055.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

8086段寄存器

8086有四个段寄存器CS,DS,SS,ES 任意时刻CPU执行CS:IP指向的指令,CS为代码段寄存器(IP为指令指针寄存器) 任意时刻SS:SP指向栈的栈顶单元,SS为栈段寄存器 我们寻找数据需要知道数据在内存的位置用DS寻址 DS为数据段寄存器 ES为附加段寄存器可作为目的地址的段地址比如ES:DI…

用jquery给元素绑定事件,一些内部细节

按看段代码: 1 $(.test).on(click, function() { 2 console.log(hello); 3 $(this).removeClass(test); 4 }); 就算是remove掉class test,照样可以点,事件绑定的是这个对象。 转载于:https://www.cnblogs.com/lqj12138/p/4384596.html

8086数据寄存器

8086CPU有四个16位数据寄存器可分成8个8位寄存器 AX(AH,AL)|BX(BH,BL)|CX(CH,CL)|DX(DH,DL) 数据寄存器主要用来保存操作数和保存运算结果等 AX 常用作累加器(accumulator)用来保存临时数据比如MOV AX,DATA将数据段地址送入AX ;MUL BL,DIV BX用来保存乘除法的结果 BX 基(Ba…

使用搜索栏过滤collectionView(按照首字母)

1.解析json数据NSDictionary *citiesDic [CoreJSONSerialization coreJSONSerialization:"cities"];NSDictionary *infor [citiesDic objectForKey:"infor"];NSArray *listItems [infor objectForKey:"listItems"]; 2.存储数据 for (NSDicti…

《哪来的天才?练习中的平凡与伟大》

这是一本堪称论述所有伟大成就来源的书中最让我觉得激动人心、非常棒的一本书。 什么成就了一个那些所谓的天才?刻意练习!伟大的成就不是因为所谓天生的基因,也不是所谓简单的埋头苦干。而是需要长时间有针对性的刻意提高自己某个方面能力的艰…

8086变址和指针寄存器

SI和DI称为变址寄存器,在字符串操作中SI作为源指针,DI作为目的指针(ES:DI<--DS:SI) ;用作存储器指针时可用于寻址 DS:[SI],DS:[BXDI]BP和SP称为指针寄存器,BP称为基址针,SP为堆栈指针 ;BP也可作为存储器指针DS:[bpsi],如果没有段前缀那么BP最为堆栈基址[BP]寻址的是堆栈内存…

R软件中 文本分析安装包 Rjava 和 Rwordseg 傻瓜式安装方法四部曲

这两天&#xff0c;由于要做一个文本分析的内容&#xff0c;所以搜索了一天R语言中的可以做文本分析的加载包&#xff0c;但是在安装包的过程&#xff0c;真是被虐千百遍&#xff0c;总是安装不成功。特此专门写一篇博文&#xff0c;把整个心塞史畅快的释放一下。 ------------…

省赛之路第一天

今天是清明假期第一天&#xff0c;原定的到洛阳玩也成为了虚无缥缈的东东了吧&#xff0c;cb这位还有说的太对了&#xff0c;no game&#xff0c;no girlfriend&#xff0c;no holiday&#xff0c;only maching&#xff01;这都不是什么大事&#xff0c;毕竟自认为还是个肯吃苦…

8086标志寄存器FLAG

8086CPU提供一个特殊的寄存器称为标志寄存器,里面包含9个标志,用来反映处理器的状态和运算结果的某些特征。FLAG是按位起作用的

Windows下安装Python数据库模块--MySQLdb

## 1、下载MySQLdb [去官网](http://pypi.python.org/pypi/MySQL-python/) 下载对应的编译好的版本&#xff08;现在官网最新版本为1.2.5&#xff09;&#xff1a; MySQL-python-1.2.5.win32-py2.7.exe 得到1MB的安装文件 MySQL-python-1.2.5.win32-py2.7.exe ## 2、安装 以…

MSSQL-字符串分离与列记录合并成一行混合使用

一般我们在数据库的表字段存储字典Id&#xff0c;如果有多个的话一般是用,或分隔符分隔(12,14),列表显示的时候是显示字典名,那如果要在数据库将字典Id转成用户看得懂的字典名&#xff0c;该怎么办呢&#xff1f; 我们这时候可以结合之前说到的 字符串分离(Split函数) 和 列记录…

逻辑运算 或,与,非

逻辑变量之间的运算称为逻辑运算。二进制数1和0在逻辑上可以代表“真”与“假”、“是”与“否”、“有”与“无”。这种具有逻辑属性的变量就称为逻辑变量。 计算机的逻辑运算的算术运算的主要区别是&#xff1a;逻辑运算是按位进行的&#xff0c;位与位之间不像加减运算…

Java 理解CPU缓存(CPU Cache)

从Java视角理解系统结构连载, 关注我的微博(链接)了解最新动态 众所周知, CPU是计算机的大脑, 它负责执行程序的指令; 内存负责存数据, 包括程序自身数据. 同样大家都知道, 内存比CPU慢很多. 其实在30年前, CPU的频率和内存总线的频率在同一个级别, 访问内存只比访问CPU寄存器慢…

测试指令TEST

测试指令TESTTEST OPRD1,OPRD2 ;按位与操作,但不保存结果,仅影响标志寄存器,根据影响的标志位得到结果 该指令通常用于检测某些位是否为1,但不改变原操作值.根据ZF得知判断结果 mov al,01100011B;检测位6是否为1,如果为1那么ZF0,如果为0那么ZF1 TEST AL,01000000B ;AL010000…

Homebrew OS X 不可或缺的套件管理器

Homebrew OS X 不可或缺的套件管理器,可以说Homebrew就是mac下的apt-get、yum. 1.安装homebrew brew的安装很简单&#xff0c;使用一条ruby命令即可&#xff0c;Mac系统上已经默认安装了ruby。 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install…

【BZOJ】【1003】【ZJOI2006】物流运输trans

最短路/DP 这题数据规模并不大&#xff01;&#xff01;这是重点……… 所以直接暴力DP就好了&#xff1a;f[i]表示前 i 天的最小花费&#xff0c;则有$f[i]min\{f[j]cost[j1][i]k\} (0\leq j \leq i-1)$其中cost数组表示第L天到第R天只用一种运输方案连续运$R-L1$天的最小代价…

与操作指令AND

逻辑”与”操作指令AND(逻辑乘法) 0*000*101*001*11 只当参与运算的逻辑变量都同时取值为1时&#xff0c;其逻辑乘积才等于1。 MOV AL,01100011BAND AL,11111110B ;按位根据乘法表计算;结果AL01100010B另一种说法是用”0”来把相应位设置成0MOV AL,01100011B ;把AL的高4位设置成…

SVN-钩子

先说说钩子是干什么的吧&#xff0c;&#xff0c;简单的说&#xff0c;svn钩子就是在提交svn时前后所要触发的事件&#xff0c;于是我们可以用钩子做一些提交时的限制&#xff0c;及提交后的操作。最常用的一般有两个&#xff0c;pre-commit,post-commit。下面分别简单说下概念…

数据库---T-SQL语句(一)

一、T-SQL语句 1.创建表:create table Name(Code varchar(50),) 主键&#xff1a;primary key 自增长&#xff1a;auto_increment 外键关系&#xff1a;references 非空&#xff1a;not null 2.删除表&#xff1a;drop table family 3.创建数据库&#xff1a;creat database…

或操作指令OR

逻辑”或”操作指令OR(逻辑加法) 000011101111 在给定的逻辑变量中&#xff0c;A或B只要有一个为1&#xff0c;其逻辑加的结果为1&#xff1b;两者都为1则逻辑加为1。 MOV AL,01100011BOR AL,10000000B ;按位根据加法表进行运算;结果AL 11100011B另一种说法是用1将相应位设为1M…