2017-01-31 7 views
1

MySQLバージョン5.5.28InnoDBプロセスを強制終了すると、クエリのROLLBACKが発生しますか?

私は誤ってWHERE句のないUPDATEクエリを実行しました。

その後、kill 202085を使用してMySQLでプロセスを強制終了しました。

自動ロールバックが発生しましたか?または、部分的に実行されたクエリについて心配する必要はありますか?

EDIT:私のクエリは、SHOW PROCESSLISTに従って「送信データ」でした。

EDIT:ここにWHERE句のないクエリがあります。私はどんな関係が指定されていませんでしたので、任意のWHERE句なし

UPDATE products t1, 
`raw_table` t2 
SET t1.`model` = t2.`model` 
, t1.`sku` = CONCAT('ABC-',t2.`model`) 

は、それは、UPDATEはどうなるのかに関して、謎です。

WHERE句を追加した後、瞬時にクエリが実行され、予想通りに約250行更新されました。

WHERE t1.`model` = t2.`old_model` 
AND t1.`vendor_id` = 53 
+0

データベースが更新されたかどうかを確認しようとしましたか?更新前に新しい値のインスタンス数がデータベースに存在するはずだった場合は、から 'select COUNT(*) 'のようなものを実行できます。 =' my_value ';'。あなたが持っていなければならない価値よりも多くのインスタンスがある場合は、おそらくあなたの変更がロールバックされなかったと推測できます。 –

+0

クラッシュ時には、再起動時にロールバックが行われます。 https://dev.mysql.com/doc/refman/5.7/en/innodb-recovery.htmlを参照してください。ロールバックには、あなたのacutalクエリーの4倍の時間がかかります。 mysqldを強制終了する前にトランザクションがコミットされていれば、ロールバックは実行されません。 – user3606329

+0

Pro-tip:プロダクションデータを扱うときは、クエリをダブルチェックまたはトリプルチェックするまでは、 ';'をタイプしないでください。また、適切なバックアップ戦略がない場合は、今すぐにバックアップ戦略を実装してください。 – tadman

答えて

2

はいロールバックします。しかし、それはクエリの段階に依存します。変更をコミットした場合はロールバックされません。操作の前にクエリを強制終了した場合は、ロールバックされます。

+0

私は興味があります、彼はトランザクションを使用していると仮定していますか、それとも重要ですか? –

+0

通常、DMLコマンドは自動コミット・モードで実行されます。操作が完了するとすぐにコミットされます。オートコミットをオフにしている場合、手動でロールバックするのも簡単です。 –

+0

@bio_spriteこれは、InnoDB MVCCをどのように経験したかを示しています。コマンドがコミット・フェーズに達していない場合は、ロールバックされます。しかし、トランザクションを巻き戻すにはかなりの時間がかかります。 – tadman

関連する問題