python使用MySQLdb遇到的事务问题

今天在使用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连接是持续的,问题就暴露出来了.

时间: 2024-10-31 22:22:31

python使用MySQLdb遇到的事务问题的相关文章

python中MySQLdb模块用法实例

篇文章主要介绍了python中MySQLdb模块用法,以实例形式详细讲述了MySQLdb模块针对MySQL数据库的各种常见操作方法,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了python中MySQLdb模块用法.分享给大家供大家参考.具体用法分析如下: MySQLdb其实有点像php或asp中连接数据库的一个模式了,只是MySQLdb是针对mysql连接了接口,我们可以在python中连接MySQLdb来实现数据的各种操作. python连接mysql的方案有oursql.PyMyS

python安装mysqldb模块

今天在阿里云一台新的服务器部署程序后台,发现上面的python缺少MySQLDB 模块,记录安装过程. 首先django程序,运行 python manage.py sycdb 报错: ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb MySQLdb模块的包名字叫mysql-python,于是pip安装之,(关于pip,可以参考这篇文章) 运行: pip install mysql-python

Mac OS X 下安装python的MySQLdb模块

参考资料: mac os x下python安装MySQLdb模块   http://www.codeif.com/post/1073/ MAC OSX使用Python安装模块有关问题  http://www.myexception.cn/operating-system/1616547.html 在Mac OS X 中安装好了MySQL和Django,在Django中访问MySQL数据库时,提示“ImportError: No module named MySQLdb”,是由于没有安装Pytho

python之MySQLdb模块

防伪码:忘情公子著 MySQLdb是用来通过python控制mysql数据库的一个模块. 在说这个模块之前,我们先来想一下在命令行模式下操作mysql数据库的步骤,一般来说分为三步: 1.连接数据库: 2.操作数据库(通过sql语句): 3.断开数据库连接 按此思路可知,python中的MySQLdb也是需要经过这三个步骤的,只不过不是在命令行模式下手工执行而已. 要想使用MySQLdb必须保证系统中有安装MySQL-python这个软件. 本篇文章主要是讲MySQLdb模块的使用,至于安装的步

Python用MySQLdb, pymssql 模块通过sshtunnel连接远程数据库

安全起见,数据库的访问多半是要做限制的,所以就有一个直接的问题是,往往多数时候,在别的机器上(比如自己本地),是不能访问数据库的,给日常使用造成了很大不便.所以前几天做了个需求,是希望在任何机器上都可以ssh到某台在数据库白名单的机器上,然后访问数据库. 经人推荐,查询了一个工具叫sshtunnel ,需要在你想要登录数据库的机器上安装. sshtunnel的基本介绍 : http://sshtunnel.readthedocs.io/en/latest/?badge=latest 这里边的图2

windows(32位 64位)下python安装mysqldb模块

windows(32位 64位)下python安装mysqldb模块 www.111cn.net 编辑:mengchu9 来源:转载 本文章来给各位使用在此windows系统中的python来安装一个mysqldb模块教程,有需要了解学习的朋友可参考参考. 1.exe下载地址:http://www.codegood.com/archives/129 分为32位和64位,下载对应的exe即可 2.下载完后,双击exe安装即可 3.检查是否安装成功:如果安装成功,将没有任何提示,如下  代码如下 复

Ubuntu安装MySQL和Python库MySQLdb步骤

一.安装MySQL服务器和客户端 执行以下命令: sudo apt-get install mysql-server-5.6 mysql-client-5.6 sudo apt-get install libmysqlclient-dev libmysqld-dev 二.Python安装MySQLdb库 执行以下命令: sudo apt-get install python-pip sudo apt-get install python-dev sudo pip install mysql-py

Python之MySQLdb操作数据库

一.python操作数据库 1.格式:大概分为三部分 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 代码 import MySQLdb conn = MySQLdb.connect(host='192.168.0.180',user='cattle',passwd='cattle',db='cattle') cur = conn.cursor()  #创建连接 reCount = cur.execute('select * from admin') data

python使用mysqldb连接数据库操作方法示例详解

# -*- coding: utf-8 -*-       #mysqldb  # site www.jbxue.com  import time, MySQLdb     #连接    conn=MySQLdb.connect(host="localhost",user="root",passwd="",db="test",charset="utf8")  cursor = conn.cursor()