zoukankan      html  css  js  c++  java
  • 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连接是持续的,问题就暴露出来了.

  • 相关阅读:
    如何高效学习读书笔记
    对Java虚拟机理解
    对Java虚拟机的认识和理解
    翻译一篇关于jedis的文章
    Java 异常机制
    spring boot基础 入门
    每天记录一个设计模式之建造者模式
    如何在mybatis 中使用In操作
    Git 基本命令有哪些
    JavaScript
  • 原文地址:https://www.cnblogs.com/ch459742906/p/7802029.html
Copyright © 2011-2022 走看看