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就会提交事务

原文地址:https://www.cnblogs.com/xiaochongc/p/14583099.html