MySQLdb的每个连接的多个事务(MySQLdb with multiple transactio

2019-07-31 12:49发布

它是怎么运用的多笔交易,但不关闭它们之间的连接的单一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()

看来工作不错,但我只是想仔细检查。

Answer 1:

我认为这是一个什么构成这里交易的误解。

你举的例子打开了一个连接,然后在其上执行一个事务。 您在事务中执行多个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个DELETE语句。

是的,你应该能够重新使用的开放连接没有问题,只要你不共享线程之间的连接。

例如, SQLAlchemy的汇集它们,根据需要向应用分发打开的连接重新使用的连接。 新的交易和新的语句在整个应用程序的生命周期这些连接执行,而不需要被关闭,直到应用程序被关闭。



Answer 2:

这将是最好先建立一个查询字符串,然后执行该单一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)


文章来源: MySQLdb with multiple transaction per connection