为什么mysql程序挂起(死锁)?

时间:2014-10-20 21:51:07

标签: mysql mysql-python

我在处理mysql挂起(死锁)时遇到了一天以上的困难。在下面的测试用例中,如果数据库不存在,我将首先尝试创建数据库,并尝试创建一个表,如果它也不存在。然后我在桌子上查询。每次执行SQL命令时,我都严格关闭光标。但该计划仍然悬而未决。我找到了两个解决方法。 1)创建数据库后关闭连接并创建新连接。 2)在查询之后调用commit()。

这两种解决方法运行良好,但它们让我更加困惑。根据我的理解,如果游标在时间上关闭并且在每次更改后调用commit(),则保持连接是可以的。而且,没有理由在查询后调用commit()。

所以我的两个变通方法甚至破坏了我对数据库操作的理解。我确实需要一些帮助来指出基本上该程序的错误......只是给我一些启示......

非常感谢!

#!/usr/bin/python2

import MySQLdb

def NewConnectToMySQL():
    conn = MySQLdb.Connect("localhost", "root", "mypassword")
    return conn

def CreateDBIfNotExists(conn):
    sql = "CREATE DATABASE IF NOT EXISTS testdb"

    cur = conn.cursor()
    cur.execute(sql)
    cur.close()

    conn.select_db("testdb")
    conn.commit()

    """workaround-1"""
    #conn.close()
    #conn = NewConnectToMySQL()
    #conn.select_db("testdb")
    return conn

def CreateTableIfNotExists(conn):
    sql = "CREATE TABLE IF NOT EXISTS mytable (id INTEGER, name TEXT)"  

    cur = conn.cursor()
    cur.execute(sql)
    cur.close()

    conn.commit()

def QueryName(conn, name):
    sql = "SELECT * FROM mytable WHERE name = '%s'" % name

    cur = conn.cursor()
    cur.execute(sql)
    info = cur.fetchall()
    cur.close()
    """workaround-2"""
    #conn.commit()

    return info

conn1 = NewConnectToMySQL()
CreateDBIfNotExists(conn1)

CreateTableIfNotExists(conn1)

QueryName(conn1, "tom")

conn2 = NewConnectToMySQL()
CreateDBIfNotExists(conn2)
CreateTableIfNotExists(conn2) #hangs here!!!!!!!!!!

这是挂起时SHOW FULL PROCESSLIST的输出。

mysql> SHOW FULL PROCESSLIST
    -> ;
+-----+------+-----------+--------+---------+------+---------------------------------+------------------------------------------------------------+
| Id  | User | Host      | db     | Command | Time | State                           | Info                                                       |
+-----+------+-----------+--------+---------+------+---------------------------------+------------------------------------------------------------+
| 720 | root | localhost | testdb | Sleep   |   96 |                                 | NULL                                                       |
| 721 | root | localhost | testdb | Query   |   96 | Waiting for table metadata lock | CREATE TABLE IF NOT EXISTS mytable (id INTEGER, name TEXT) |
| 727 | root | localhost | NULL   | Query   |    0 | NULL                            | SHOW FULL PROCESSLIST                                      |
+-----+------+-----------+--------+---------+------+---------------------------------+------------------------------------------------------------+
3 rows in set (0.00 sec)

0 个答案:

没有答案