2016-07-16 5 views
1

:私はコマンドcommitを発行していないもののコミットが発行されなかったときにレコードが挿入されるのはなぜですか?次の文を実行する上で

set autocommit = false; 
start transaction; 
insert into test_table (id,name) values('6','iqbal bano'); 

エントリは、データベースに挿入されます。この動作はmysqlに自然ですか?はいの場合、どうしてそうですか?しかし、以前の挿入が成功し、id 7のエントリがに作成される(nayaaraは、引用符内にラップしなければならなかったので)

set autocommit = false; 
start transaction; 
insert into test_table (id,name) values('7','chitra singh'); 
insert into test_table (id,name) values('8',nayaara); 

3番目のステートメントは、エラーを返しますように私の驚きに、私は3文を実行した場合データベース。これの理由は何ですか?これが取引の進行方法ですか?

注:上記の文のように、自動コミットはfalseに設定されています。

+0

@Drew Autocommitは 'false'に設定されています。編集をご覧ください。 –

+0

こんにちは@SuhailGuptaあなたはこのコマンドの出力を提供することができますか? SELECT * FROM information_schema.global_variables WHERE variable_nameのように '%version%'; – Jordon

+0

@ ShivaShindeあなたはどんな属性値を探していますか? –

答えて

1

自動コミットをfalseに設定し、挿入が通過すると、そのトランザクションの部分がデータベースにコミットされません。データベースを再起動すると、挿入が失われます。あなたがコミットを言っていないので、トランザクションはロールバックされます。ただし、コミットして再起動してもレコードは失われません。

mysql> set autocommit=false; 

    Query OK, 0 rows affected (0.00 sec) 

    mysql> insert into test (id) values (5),(6),(7),(8); 
    Query OK, 4 rows affected (0.00 sec) 
    Records: 4 Duplicates: 0 Warnings: 0 

    mysql> select * from test; 
    +------+ 
    | id | 
    +------+ 
    | 1 | 
    | 2 | 
    | 3 | 
    | 4 | 
    | 5 | 
    | 6 | 
    | 7 | 
    | 8 | 
    +------+ 
    8 rows in set (0.00 sec) 

    mysql> exit 
    Bye 
mysql> select * from test; 
+------+ 
| id | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
+------+ 
4 rows in set (0.00 sec) 

mysql> insert into test (id) values (5),(6),(7),(8); 
Query OK, 4 rows affected (0.01 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> select * from test; 
+------+ 
| id | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
+------+ 
8 rows in set (0.00 sec) 

mysql> commit; 
Query OK, 0 rows affected (0.00 sec) 

mysql> select * from test; 
+------+ 
| id | 
+------+ 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
+------+ 
8 rows in set (0.00 sec) 
+0

申し訳ありません。しかし、 'select'ステートメントを実行すると、どのようにデータ(データベースの再起動時に失われる)が見えますか? –

+0

私はそれを調査していません。しかし、私はそれを考えると失われてしまいます。しかし、mysqlデータベースはマスタースレーブDBインスタンスとして設定されていると、バイナリログを持っています。したがって、スレーブはマスターからデータを複製できます。単一のスタンドアロンインスタンスのログを有効にすることができます。その場合は、そのログを使用して回復するか、ログをリバースエンジニアリングして正確に何が起きたかを把握することができます。マスター/スレーブレプリケーションのロギングでは、パフォーマンスが1つのインスタンスでどのようになるか分かりません。 –

+0

ロギングをオンにした場合、かなりのスペースを占めるため、ログのクリーニング/削除の問題も発生します。しかし、データベース内のレコード数、スキーマ構造などに応じて、すべての相対的な関係 –

関連する問題