2012-01-12 7 views
5

私はdocsで読む:COMMITまたはROLLBACKが Connectionオブジェクトによって実行されたときにカーソルがクエリを実行すると、トランザクションの開始以来...SELECTでもトランザクションが開始されますか?

が、最終的。

import MySQLdb 

db = MySQLdb.connect(user="root", db="test") 
c = db.cursor() 
c.execute("SELECT * FROM books") 
print c.fetchall() 

私はクエリがデータのみを読み取り、それを書き込みませんかどうかを知ることは困難であるためのMySQLdbは、偶数(SELECTなど)の情報を変更しないクエリにトランザクションを開始することを疑います。

  1. 本当ですか?
  2. これは、すべてのクエリの後にcursor.commit()を実行して、テーブルがロックされていないことを確認することを意味しますか?
  3. 私が気付いていないその他の問題?

はい、SELECT文は、他のようなものですので、トランザクションが開始あなた

答えて

3

ありがとうございます。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 

は、次の命令は、それが変更された行を読み取ることができると述べている:具体的には

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; 
SELECT * FROM books ; 
COMMIT ; 

:あなたはこれを避けたい場合は

は、あなたはそのような何かを行うことができますまだCOMMITを受け取っていません。 その種のトランザクションは排他ロックを取得できません。

第2部分SELECT * FROM books ;は明らかにであり、第3部分COMMIT ;はトランザクションを終了して永久にします。 その場合、何も書き込みが行われていませんので、COMMITのみトランザクションを終了するために使用され、

+0

あなたはあなたの例を説明してもらえ、そしてなぜ 'commit'がまだ必要ですか? – warvariuc

+0

@warwaruk:この質問は更新されましたか?私はそれが違っていたことを覚えています。 – DonCallisto

+0

いいえ、更新されていませんでした... – warvariuc

1
  1. それは、 本当ですが、MySQLクライアントはデフォルトで autocommit=1で始まるので、それは同様に、自動的に、各クエリの後にコミット

  2. SELECTは、ステートメントの実行後にロックを保持しないため、使用しないでください。実際には、明示的なコミットは大幅に遅くなることさえあります。

  3. だけでは役に立つかもしれない:Why connection in Python's DB-API does not have "begin" operation?

+0

'autocommit = 1'はPythonの' MySQLdb'には当てはまりません!これを明示的に設定する必要があります。これは、Pythonの誤解の一般的な原因です。「ちょうど私が挿入したデータはどこですか?」 –

+1

@ ocaso-protal、hmm、true。なぜ私はまだ 'init_command'パラメータをautocommit = 0に設定しておいたのかと思っています。 – newtover

関連する問題