python使用MySQLdb遇到的事務問題
阿新 • • 發佈:2017-11-08
操作mysql 使用 無法查詢 一個隊列 得到 執行c 新的 pda col
今天在使用MySQLdb時,發現update某一條記錄後,select並沒有得到更新,後來才發現是事務的問題,
我在python中操作mysql時,一直使用的是MySQLdb,而這個MySQLdb庫是默認關閉自動提交事務的,也就是說,如果沒有在程序中顯式的設置SET AUTOCOMMIT=1 ,那對具有事務功能的表,比如引擎為innodb的表修改時,每次都要執行commit才能真正提交當前修改.
以下是我之前的設置以及查詢到的AUTOCOMMIT值
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當前事務,這樣後我再查詢時,才能得到最新的數據.
改正方案:數據庫創建連接後,我就明確指定AUTOCOMMIT為1,然後select問題就解決了
# -*- 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連接是持續的,問題就暴露出來了.
python使用MySQLdb遇到的事務問題