python使用MySQLdb遇到的事务问题

今天在使用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

相关文章
相关标签/搜索