【问题标题】:mysql connector not showing inserted resultsmysql连接器未显示插入结果
【发布时间】:2014-03-25 08:10:06
【问题描述】:
% sudo yum info MySQL-python.x86_64
Loaded plugins: priorities, update-motd, upgrade-helper
Installed Packages
Name        : MySQL-python
Arch        : x86_64
Version     : 1.2.3
Release     : 0.3.c1.1.9.amzn1

外壳#1:

% python
Python 2.6.9 (unknown, Oct 29 2013, 19:58:13)
[GCC 4.6.3 20120306 (Red Hat 4.6.3-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mysql.connector as mysqlconn
>>> cnx = mysqlconn.connect(...)
>>> cur = cnx.cursor()
>>> cur.execute("insert into sometable(id, name) values(%s, %s)", (28, "28"))
>>> cnx.commit()

外壳 #2:

% python
Python 2.6.9 (unknown, Oct 29 2013, 19:58:13)
[GCC 4.6.3 20120306 (Red Hat 4.6.3-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mysql.connector as mysqlconn
>>> cnx = mysqlconn.connect(...)
>>> cur = cnx.cursor()
>>> cur.execute("select id, name from sometable where id = 28")
>>> cur.fetchall()
[(28, u'28')]

到目前为止一切顺利。当事情变得令人惊讶时:

外壳#1:

>>> cur.close()
True
>>> cur = cnx.cursor()
>>> cur.execute("insert into sometable(id, name) values(%s, %s)", (29, "29"))
>>> cnx.commit()
>>>

外壳 #2:

>>> cur.close()
True
>>> cur = cnx.cursor()
>>> cur.execute("select id, name from sometable where id = 29")
>>> cur.fetchall()
[]
>>>

由于某种原因,当前连接的 shell #2 看不到新插入的 id=29 记录。在 shell #2 中创建新连接将解决问题,但显然我不想这样做。我应该注意到 /usr/bin/mysql 在任何时候都有一致的视图,并且当 shell #2 没有时看到 id=29 记录,即使 /usr/bin/mysql 在 python 中做任何事情之前很久就打开了。此外,shell #1 会看到它刚刚插入的 id=29 记录及其当前连接。所以我怀疑我使用与 python mysql 连接器连接的方式有问题,但我已经没有想法了。

【问题讨论】:

  • 这很有趣:在我发送 SELECT 语句之前在 shell#2 中添加一个 cnx.commit() (它只从数据库中读取,从不写入)也解决了这个问题。我错过了什么吗?我真的不想设置 autocommit=True,也不想在我的所有 SELECT 语句之前发送 COMMIT。
  • 我应该添加:ENGINE=InnoDB
  • 添加更多:/usr/bin/mysql 看到新记录,因为它有 autocommit=1。禁用它(设置 autocommit = 0)后,它也看不到新行。我怀疑默认隔离级别是问题所在:dev.mysql.com/doc/refman/5.1/en/innodb-consistent-read.html
  • 请注意,MySQL-Python 不是 MySQL 连接器/Python。由于您导入了mysql.connector,因此您使用的是后者。

标签: python mysql database mysql-python mysql-connector


【解决方案1】:

MySQL 的默认隔离级别是REPEATABLE READ。如果您在 shell #1 中插入数据并发出 COMMIT,则数据将仅可用于此 COMMIT 之后新启动的事务。 shell #2 中的事务仍在进行中,不会看到新数据。

您可以通过在服务器(或会话)上设置默认事务隔离级别来更改此设置,或者更好地为当前事务设置隔离。

使用 MySQL 连接器/Python v1.1,使用MySQLConnection.start_transaction() method 可以轻松设置隔离。在 shell #2 中,执行以下操作:

>>> cnx = mysql.connector.connect(...)
>>> cnx.start_transaction(isolation_level='READ COMMITTED')
>>> cur = cnx.cursor()
>>> cur.execute("select id, name from sometable where id = 29")
>>> cur.fetchall()
# Do something in shell #1 and commit there
>>> cur.execute("select id, name from sometable where id = 29")
>>> cur.fetchall()
[(28, u'28')]

start_transaction不是PEP-249,但是你可以简单地执行SQ​​L语句START TRANSACTION ISOLATION LEVEL READ COMMITTED或者设置会话变量tx_isolation。但是我觉得start_transaction这个方法更简单。

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 1970-01-01
    • 2014-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    相关资源
    最近更新 更多