今天在使用MySQLdb時,發現update某一條記錄後,select並無獲得更新,後來才發現是事務的問題,python
我在python中操做mysql時,一直使用的是MySQLdb,而這個MySQLdb庫是默認關閉自動提交事務的,也就是說,若是沒有在程序中顯式的設置SET AUTOCOMMIT=1 ,那對具備事務功能的表,好比引擎爲innodb的表修改時,每次都要執行commit才能真正提交當前修改.mysql
如下是我以前的設置以及查詢到的AUTOCOMMIT值sql
import MySQLdb db = MySQLdb.connect(myhost,myuser,mypass,mydb ) db.set_character_set('utf8') cursor = db.cursor(cursorclass = MySQLdb.cursors.DictCursor) cursor.execute('SET NAMES utf8;') sql='show variables like "AUTOCOMMIT"' cursor.execute(sql) record = cursor.fetchone() print record #執行結果爲 {'Value': 'OFF', 'Variable_name': 'autocommit'}
這個在以前沒發生問題.然而今天在寫一個隊列的循環查詢功能時,發現,若是我先查詢一條記錄,接着對此記錄修改,而後再查詢此記錄,那麼我就不能查到修改後的記錄..數據庫
問題就出在了我對事務的運用上.我雖然對具備修改操做的語句(update,delete)使用了commit,但我沒有對select進行commit,這樣會致使個人select始終在一個事務中,我在這個事務中沒法查詢到記錄發生了變化,除非我在進行下一個查詢前,顯式地commit當前事務,這樣後我再查詢時,才能獲得最新的數據.fetch
改正方案:數據庫建立鏈接後,我就明確指定AUTOCOMMIT爲1,而後select問題就解決了spa
# -*- coding:utf-8 -*- import MySQLdb db = MySQLdb.connect(myhost,myuser,mypass,mydb ) db.set_character_set('utf8') cursor = db.cursor(cursorclass = MySQLdb.cursors.DictCursor) cursor.execute('SET NAMES utf8;') cursor.execute('SET AUTOCOMMIT=1;') #明確指定要自動提交事務
ps.爲啥之前沒出問題呢,由於之前執行這個腳本用的是定時任務,每次程序執行完就退出,mysql鏈接自動關閉,而如今我在寫一個一直執行的隊列處理腳本,mysql鏈接是持續的,問題就暴露出來了.code