MySQLdb autocommit的坑

今天写的一个小功能,里面要用MySQLdb更新数据库,语句如下

sql = "update %s.account_operation set status=1 where username=‘%s‘" % (allResDBInfos[‘db‘], username)

  

变量替换后,是下面的样子

update suspects.account_operation set status=1 where username=‘[email protected]‘

  

语句没问题,数据库中也存在username为‘[email protected]‘的记录,并且手动执行也是正确的(status被正确的更新为1)

但奇怪的就是在Python中用MySQLdb更新的时候没有效果

原因就是suspects.account_operation这张表用的InnoDB引擎,InnoDB是事务性引擎,有个autocommit的变量控制是否自动提交事务。InnoDB默认的autocommit=1,也就是说,每条语句都是一个事务,都会被自动提交。但如果设置autocommit=0,关闭自动提交的话,就需要我们手动commit了。commit之前的所有更新都在一个事务内,如果不commit的话,这些更新都不会生效。

用MySQL的客户端连接时,autocommit=1,是会自动提交的。有意思的是,MySQLdb这个库默认autocommit=0,所以需要手动提交。

下面是MySQLdb的关于autocommit的说明,从1.2.0版本开始,默认禁用autocommit。

链接:http://mysql-python.sourceforge.net/FAQ.html#my-data-disappeared-or-won-t-go-away

My data disappeared! (or won‘t go away!)

Starting with 1.2.0, MySQLdb disables autocommit by default, as required by the DB-API standard (PEP-249). If you are using InnoDB tables or some other type of transactional table type, you‘ll need to do connection.commit() before closing the connection, or else none of your changes will be written to the database.

Conversely, you can also use connection.rollback() to throw away any changes you‘ve made since the last commit.

Important note: Some SQL statements -- specifically DDL statements like CREATE TABLE -- are non-transactional, so they can‘t be rolled back, and they cause pending transactions to commit.

上面这些内容都是针对InnoDB的,对于MyISAM这样的非事务性引擎,不存在事务概念,只管更新即可,autocommit是0或1都没有影响。

时间: 2024-10-29 00:32:17

MySQLdb autocommit的坑的相关文章

MySQLdb autocommit

MySQLdb 中 autocommit 默认是关闭的,下面是例子. import MySQLdb conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='131417',db='studio');cursor = conn.cursor();cursor.execute('select @@autocommit'); data = cursor.fetchone();print data; cursor.close();conn.

django的mysqldb的坑

使用django,在配置mysql之后就报错: django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: No module named MySQLdb 但是我django使用的是pymysql, 所以怎么都找不到具体问题,后来才想起使用pymysql得指定使用pymysql: 在工程下的__init__.py中添加: import pymysqlpymysql.install_as_MySQLdb()

关于PooledDB使用autocommit的方法

在Python里,普通使用数据库,可以通过调用connection里的autocommit函数来设置是否打开自动更新 self._db = MySQLdb.connect(**self._db_args) self._db.autocommit(True) 但是如果使用了线程池PooledDB,则不能使用线程池返回的connection来设置,而是在创建线程池的时候来进行设置 self.__pool = PooledDB(creator=MySQLdb, mincached=1 , maxcac

【mysql】MySQLdb中的事务处理

MySQL数据库有一个自动提交事务的概念,autocommit.含义是,如果开启autocommit, 则每一个语句执行后会自动提交.即一个语句视为一个事务. 在python使用的MySQLdb中,默认是不开启autocommit的.所以,只有在显示commit后,数据库操作才会真正提交.或者在rollback()后,回滚到上一次commit的状态. 例: #!/bin/env python #coding=utf-8 import MySQLdb class MYSQL(object): de

Python MySQLdb Linux下安装笔记

本文介绍了Python MySQLdb Linux下安装笔记,本文分别讲解了快速安装和手动编译安装两种方法,并分别讲解了操作步骤,需要的朋友可以参考下 主要针对centos6.5 64位系统 默认python版本为2.6 编码安装python2.7和python3.4      一.yum快速安装 yum install MySQL-python yum install python-setuptools 经常接触Python的同学可能会注意到,当需要安装第三方python包时,可能会用到eas

MySQLdb

show create table users查看 INNODB MyISAM 不支持事务 错误时无法回滚 # Python DB API # 数据库连接对象 connection # cursor 使用该连接创建并返回游标 # commit 提交当前事务 # rollback 回滚当前事务 # close 关闭连接 # 数据库交互对象 cursor # 游标对象 用于执行查询和获取结果 # execute(op[,args]) 执行一个数据库查询和命令 # fetchone() 获取结果集的下

ubuntu14.04 python2.7安装MySQLdb

安装依赖: sudo apt-get install libmysqlclient-dev libmysqld-dev python-dev python-setuptools 安装MySQLdb pip install MySQL-python conn = mdb.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='test', charset='utf8') config = { 'host': '127

mac os10.11下安装MySQLdb

最近在mac下安装mysqldb-python搞的好麻烦,为了避免这个坑,先记下来再讲! 首先重启mac,长按cmd+R,进入恢复模式,然后依次点击应用->终端,然后输入csrutil disable,究其原因,是因为某些库文件mac为了安全不让写入,所以,必须把安全模式关闭:然后启动mac: 然后 >>> import MySQLdb Traceback (most recent call last): File "<stdin>", line 1

When to close cursors using MySQLdb

http://stackoverflow.com/questions/5669878/when-to-close-cursors-using-mysqldb I'm building a WSGI web app and I have a MySQL database. I'm using MySQLdb, which provides cursors for executing statements and getting results. What is the standard pract