2012-01-10 6 views
2

私はmysqlサーバに接続するためにmysqldbアダプタでweb2py dalを使用しています。"トランザクションを開始"なしの単一の "コミット"文

私の質問:

  1. なぜそれが単一
  2. "= 0セットの自動コミットが" 文が始まる "選択" した後、 "取引を開始" 招くことなく "をコミットする" 必要がありません自動コミット= 0の場合のトランザクション?

サーバー情報: InnoDBエンジン 自動コミット= 1(デフォルト値) tx_isolation =反復可能読み取り(デフォルト値)

general_log:

100356 10:00:00 123456 Connect [email protected] on dummydb 
123456 Query SET NAMES 'utf8' 
123456 Query SET AUTOCOMMIT = 0 
123456 Query COMMIT 
123456 Query SET FOREIGN_KEY_CHECKS=1 
123456 Query SET sql_mode='NO_BACKSLASH_ESCAPES' 

答えて

7

ええと...あなたは無効理由オートコミット?

はここで良い説明です:自動コミットして

http://rpbouman.blogspot.com/2007/02/mysql-transactions-and-autocommit.html

が有効になって、すべての文は、独自の トランザクション内にラップされます。文の正常な実行には暗黙的に が続き、COMMITが続き、エラーが発生すると、 トランザクションが中止され、変更がロールバックされます。

デフォルトでは、自動コミットはMySQLで有効になっています。

  1. 「取引」は自動コミットがあなたに1つの文の「幻想」を与えるだけ

  2. 「1つのアトミックエンティティとして複数の文を実行する」については必ずしもありません。つまり

== 1トランザクション

  • 実際には、「自動コミットオフ」により、「1つの明細== 0取引」が得られます

  • 同じリンクから

    は...オフ自動コミットしたの 全体のポイントは、あなたが 複数の文を発行し、一度にすべてをコミットすることができるということです。

    +0

    ありがとう、ジョナサン。したがって、この文脈では "begin"が暗黙的に発行されます。別の質問:セッションAのステートメントを「コミット」すると、セッションBからセッションAにコミットされた変更が反映されますか? (tx_isolation = repeatable-read) –

    +0

    これはPaulの答えですが、COMMIT後に新しいトランザクションを開始するので、以前のトランザクションを開始してから他の人がデータベースにコミットした変更も表示されます。 –

    3

    標準SQLでは、トランザクション内に(ほぼ)常に存在します。 COMMITまたはROLLBACKを実行すると、次のステートメントは新しいトランザクションを開始します。したがって、変更を有効にするには、コミットする必要があります。

    AutoCommitを有効にしている場合、各ステートメントはシングルトントランザクションであり、成功した場合は自動的にコミットされ、失敗した場合はロールバックされます。

    AutoCommitをオフにすると、データベースの変更が有効になるようにCOMMITする必要があります。

    一部のDBMSには、このテーマに関するマイナーなバリエーションがあります。

    特に、Informixは明示的なBEGIN [作業]を実行するまでAutoCommitがオンのデータベースモードを1つ持っています。 COMMIT [WORK]またはROLLBACK [WORK]を実行するまではトランザクション中です。また、標準SQLのように動作する 'MODE ANSI'もあります。トランザクションがまったくない未記録モードがあります。

    これまで述べてきたことは、実際にトランザクションサポートが必要なことは自明ではありません。 DML文(SELECT、INSERT、DELETE、UPDATE、MERGEなど)やトランザクションサポートを必要とするDDL文になる傾向があります。一部のDBMSでは、DDL文をロールバックすることはできません(Oracle)。他のもの(Informix)

    関連する問題