2

私はmysqldbアダプタでweb2py dalを使用してmysqlサーバーに接続しています。

私の質問:

  1. 「 set autocommit=0」の後に「begin transaction 」を開始せずに単一の「 commit 」が必要なのはなぜですか
  2. autocommit=0 の場合、「select」ステートメントはトランザクションを開始しますか?

サーバー情報: innodb engine autocommit=1 (デフォルト値) tx_isolation=repeatable-read (デフォルト値)

一般ログ:

100356 10:00:00 123456 Connect  dummy@172.0.0.1 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'
4

2 に答える 2

7

ええと...自動コミットを無効にしたため????

ここに良い説明があります:

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

自動コミットを有効にすると、すべてのステートメントが独自のトランザクション内にラップされます。ステートメントの実行が成功すると、暗黙的に COMMIT が続き、エラーが発生するとトランザクションが中止され、変更がロールバックされます。

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

言い換えると:

  1. 「トランザクション」は、必ずしも「複数のステートメントを 1 つのアトミック エンティティとして実行する」ことだけではありません。

  2. autocommit は、1 つのステートメント == 1 つのトランザクションの「錯覚」を与えます

  3. 実際、「automcommit off」は「1 つのステートメント == 0 トランザクション」を提供します。

同じリンクから:

...自動コミットをオフにすることの要点は、複数のステートメントを発行して一度にすべてコミットできることです。

于 2012-01-10T07:09:31.050 に答える
3

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

AutoCommit をオンにすると、各ステートメントはシングルトン トランザクションになり、成功すると自動的にコミットされ、失敗するとロールバックされます。

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

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

特に Informix には、明示的な BEGIN [WORK] を実行するまで AutoCommit がオンになるデータベース モードが 1 つあります。その後、COMMIT [WORK] または ROLLBACK [WORK] を実行するまで、トランザクションになります。また、標準 SQL のように動作する「MODE ANSI」もあります。また、トランザクションがまったくないログなしモードがあります。

そうは言っても、あなたが示すステートメントは、トランザクションのサポートが本当に必要な自明のステートメントではありません。DML ステートメント (SELECT、INSERT、DELETE、UPDATE、MERGE など) である傾向があり、場合によってはトランザクション サポートを必要とする DDL ステートメントです。一部の DBMS では、DDL ステートメントをロールバックできません (Oracle)。他の人はそうします (Informix)。

于 2012-01-10T07:15:06.200 に答える