MySQLdb with multiple transaction per connection

本秂侑毒 提交于 2020-01-02 03:24:05

问题


Is it okay to use a single MySQLdb connection for multiple transactions without closing the connection between them? In other words, something like this:

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()

It seems to work okay, but I just wanted to double check.


回答1:


I think there is a misunderstanding about what constitutes a transaction here.

Your example opens up one connection, then executes one transaction on it. You execute multiple SQL statements in that transaction, but you close it completely after committing. Of course that's more than fine.

Executing multiple transactions (as opposed to just SQL statements), looks like this:

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()

The above code commits 10 transactions, each consisting of 10 individual delete statements.

And yes, you should be able to re-use the open connection for that without problems, as long as you don't share that connection between threads.

For example, SQLAlchemy re-uses connections by pooling them, handing out open connections as needed to the application. New transactions and new statements are executed on these connections throughout the lifetime of an application, without needing to be closed until the application is shut down.




回答2:


It would be better to first build a query string and then execute that single MySQL statement. For example:

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)


来源:https://stackoverflow.com/questions/12378227/mysqldb-with-multiple-transaction-per-connection

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!