事務,我們都知道具有原子性,操作要么全部成功,要么全部失敗。但是有可能會造成誤解。
我們先准備一張表,來進行測試
CREATE TABLE `name` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID', `name` varchar(32) DEFAULT '' COMMENT '名稱', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
一、如果事務中,有某條sql語句執行時報錯了,我們沒有手動的commit,那整個事務會自動回滾嗎?
答案:會。
當我們直接把窗口關掉,新開窗口再去查詢表name時,表中沒有第一次插入的記錄,說明整個事務被回滾了。
二、如果事務中,有某條sql語句執行時報錯了,我們手動的commit,那整個事務還會回滾嗎?
答案:不會。
事務中如果有sql執行錯誤,但是我們commit了,mysql仍然會執行成功的語句,並不會把整個事務自動回滾。
三、如果事務中,有某條sql語句執行時報錯了,我們重新又開啟一個事務,那之前事務還會回滾嗎?
答案:不會。
我們在該會話中,重新用 begin; 開啟了一個新事務,新開的事務會將該會話中未提交的事務提交(相當於commit),所以上一個事務被提交了,導致語句一記錄寫入表中。