zoukankan      html  css  js  c++  java
  • python

    坑:

    查询数据库 -> 修改数据库内容 -> 再次查询数据库,会发现两次查询结果一样,修改的内容未被查询出来

    import MySQLdb
    
    
    conn = MySQLdb.connect(
        host='192.168.1.101',
        port=3306,
        user='123',
        passwd='123',
        db='test',
        charset='utf8'
    )
    
    cur1 = conn.cursor()
    
    sql1 = "select id from user"
    cur1.execute(sql1)
    nn = cur1.fetchall()  # 111
    print(nn)
    cur1.close()
    
    
    # ---修改数据库中id的值为222---
    
    
    cur2 = conn.cursor()
    sql2 = "select id from user"
    cur2.execute(sql2)
    mm = cur2.fetchall()  # 111
    print(mm)
    cur2.close()
    
    
    conn.close()

    这是因为python的Mysqldb默认关闭autocommit,任意执行一个select子句,对于Mysql5.5以上版本,都会造成MATADATA LOCK阻塞

    第一次查询后,产生阻塞,所以后续不能查询到最新数据

    解决方法:

    python的MySQLdb的API把数据库更新语句做为事务来执行,这样的话,虽然使用execute语句执行了sql,但是并没有真的对数据库进行改变,除非使用commit方法来显式的提交事务才可以对数据库造成影响,否则,数据库会自动回滚。所以解决方案:增加commit,有三种方式可选:

    方式一:在连接数据库时,设置自动commit

    conn = MySQLdb.connect(
        host='192.168.1.101',
        port=3306,
        user='123',
        passwd='123',
        db='test',
        charset='utf8',
        autocommit='True'
    )

    方式二:在查询之前,设置自动commit

    conn.autocommit('True')

    方式三:在第一次查询结束后,增加以下一句,手动commit:

    conn.commit()  

    ps:

    此坑只存在于mysql引擎是InnoDB的情况下

    如果你的mysql引擎是Myisam,则只要调用execute就会提交事务

  • 相关阅读:
    WCF ria services完美登陆功能(10)
    利用DYCOM快速建立wcf服务器端
    DYCom简要介绍
    断剑
    生命的价值
    飞翔的蜘蛛
    JSP中如何获取select标签选中的值
    wrapClass
    iconfont 在vue项目中的应用(iconcomponent组件)
    正则表达式
  • 原文地址:https://www.cnblogs.com/xiaochongc/p/14583099.html
Copyright © 2011-2022 走看看