2012-09-11 10 views
6

複数のトランザクションに対して単一のMySQLdb接続を使用することはできますか?言い換えれば、このような何か:接続ごとに複数のトランザクションを持つ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() 

大丈夫動作するようだが、私はちょうどダブルチェックしたかったです。

+0

あまりにも間違いを犯さなかった。 Martijn Pietersの話が誤解されていることが分からなかったので、改訂を読む前に本当に混乱しました。 –

答えて

15

ここで取引を構成するものについて誤解があると思います。

この例では、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個の個々の削除文からなる各々をコミット。

はい、スレッド間の接続を共有していない限り問題なくオープン接続を再利用できるはずです。

たとえば、SQLAlchemyは、それらをプールして再接続し、アプリケーションに必要に応じて開いている接続を渡します。新しいトランザクションと新しいステートメントは、アプリケーションが停止するまで閉じる必要なく、アプリケーションの存続期間を通じてこれらの接続上で実行されます。

+0

ええ、そうです。私はそれを投稿するためにそれを水で下ろしながら私の例を台無しにした。私はそれを修正します。 – d512

+0

私のシナリオでは、スレッド間の接続を共有することで何が問題になるでしょうか? – d512

+2

@ user1334007:[MySQLdb documentation](http://mysql-python.sourceforge.net/MySQLdb.html)から:*「2つのスレッドが同時に接続を使用するようにすると、MySQLクライアントライブラリがうまく動いて死んでしまうでしょう。あなたは警告されています。 –

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) 
+0

それはより効率的ですが、私がそうしない理由があります。 – d512

+0

ちょっと調べてください。 –

関連する問題