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.pswp.cn/news/375186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375186.shtml
英文地址,請注明出處:http://en.pswp.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…