1. 程式人生 > >python使用MySQLdb遇到的事務問題

python使用MySQLdb遇到的事務問題

操作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遇到的事務問題