MySQLdb每个连接有多个事务

d51*_*512 7 python mysql database database-connection mysql-python

是否可以将单个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()
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 19

我认为这里有什么构成交易存在误解.

您的示例打开一个连接,然后在其上执行一个事务.您在该事务中执行多个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()
Run Code Online (Sandbox Code Playgroud)

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

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

例如,SQLAlchemy通过合并它们来重新使用连接,根据需要向应用程序分发打开的连接.在应用程序的整个生命周期中,将在这些连接上执行新事务和新语句,而无需在应用程序关闭之前关闭.

  • @ user1334007:来自[MySQLdb文档](http://mysql-python.sourceforge.net/MySQLdb.html):*"如果让两个线程同时使用连接,MySQL客户端库可能会崩溃并死掉.你已被警告过."*. (2认同)