2017-01-31 43 views
1

MySQL版本5.5.28是否查殺InnoDB進程導致ROLLBACK?

我不小心運行了一個沒有WHERE子句的UPDATE查詢。

然後我使用kill 202085殺死了MySQL中的進程。

是否導致自動回滾?或者我需要擔心部分執行的查詢?

編輯:我的查詢是「發送數據」根據SHOW PROCESSLIST

編輯:這裏是沒有WHERE條款的查詢。

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

沒有任何WHERE條款,這是一個謎,以什麼UPDATE會做,因爲我沒有指定任何關係。

添加WHERE子句後,我的查詢立即執行,並按預期方式更新約250行。

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

您是否嘗試過檢查數據庫以查看行是否已更新?如果知道在更新之前應該在數據庫中有多少實例的新值,那麼可以運行如下類似的方法:從中選擇COUNT(*),其中 ='my_value';'。如果你有更多的實例,那麼你可以假設你的改變沒有回滾。 –

+0

在發生崩潰時,重新啓動後會回滾。請參閱https://dev.mysql.com/doc/refman/5.7/en/innodb-recovery.html - 回滾將比您的acutal查詢長4倍。如果在你殺死mysqld之前事務已經被提交,它將不會執行回滾。 – user3606329

+0

專業提示:在生產數據上工作時,不要輸入';',直到你有兩次或三次檢查你的查詢。另外,如果你沒有一個好的備份策略,現在是時候實施一個。 – tadman

回答

2

是的,它回滾。但它取決於查詢的階段。如果它已經提交了更改,它將不會回滾。如果您在操作之前設法終止查詢,則會回滾。

+0

我很好奇,你假設他在使用交易還是重要? –

+0

通常DML命令以自動提交模式運行。手術一旦完成,他們就會承諾。如果他關閉自動提交,那麼它也很容易手動回滾。 –

+0

@bio_sprite這是我體驗InnoDB MVCC的工作方式。如果該命令沒有進入提交階段,它將回滾。儘管放鬆交易可能需要相當長的時間。 – tadman

相關問題