8

可以在不关闭它们之间的连接的情况下对多个事务使用单个 MySQLdb 连接吗?换句话说,是这样的:

conn = MySQLdb.connect(host="1.2.3.4", port=1234, user="root", passwd="x", db="test")

for i in range(10):
    try:
        cur = conn.cursor()
        query = "DELETE FROM SomeTable WHERE ID = %d" % i
        cur.execute(query)
        cur.close()
        conn.commit()

    except Exception:
        conn.rollback()

conn.close()

它似乎工作正常,但我只是想仔细检查。

4

2 回答 2

20

我认为这里对交易的构成存在误解。

您的示例打开一个连接,然后在其上执行一项事务。您在该事务中执行多个 SQL 语句,但在提交后将其完全关闭。当然,这还不错。

执行多个事务(而不仅仅是 SQL 语句),如下所示:

conn = MySQLdb.connect(host="1.2.3.4", port=1234, user="root", passwd="x", db="test")

for j in range(10):
    try:
        for i in range(10):
            cur = conn.cursor()
            query = "DELETE FROM SomeTable WHERE ID = %d" % i
            cur.execute(query)
            cur.close()
        conn.commit()
    except Exception:
        conn.rollback()

conn.close()

上面的代码提交了 10 个事务,每个事务由 10 个单独的删除语句组成。

是的,只要您不在线程之间共享该连接,您就应该能够毫无问题地重新使用打开的连接。

例如,SQLAlchemy通过池化连接来重用连接,根据需要将打开的连接分发给应用程序。在应用程序的整个生命周期中,新事务和新语句都会在这些连接上执行,而无需在应用程序关闭之前关闭。

于 2012-09-11T22:52:43.803 回答
0

最好先构建一个查询字符串,然后执行该单个 MySQL 语句。例如:

query = "DELETE FROM table_name WHERE id IN ("
for i in range(10):
    query = query + "'" + str(i) + "', "
query = query[:-2] + ')'

cur = conn.cursor()
cur.execute(query)
于 2012-09-11T23:56:00.477 回答