事物的概念:mysql
事物由一個單獨單元的一個或多個sql語句組成,若是其中一個語句不能完成,整個單元就會回滾,全部影響到的數據將返回到事物開始之前的狀態。於是,只有事物中的全部語句都成功執行才能說明這個事物被成功的執行。sql
這句話的自己沒有什麼問題,可是請看下面的案例數據庫
mysql事務中有兩條insert語句,其中第二條語句是錯誤的,在運行完事務後,第一條仍然插進去了,代碼以下。code
//建立表:CREATE TABLE `test_tab` (`f1` int(11) NOT NULL ,`f2` varchar(11) DEFAULT NULL ,PRIMARY KEY (`f1`))ENGINE=InnoDB//執行事務:START TRANSACTION;INSERT INTO test_tab VALUES (1, '2');INSERT INTO test_tab VALUES (1, '3');COMMIT;
一開始認爲只要把事務寫出來,最後用commit提交一下,數據庫會自動判斷這些語句是否全執行成功,若是成功則把全部的數據插入到數據庫,若是有一條失敗就自動回滾至原始狀態!顯然我認爲錯了。事務
[SQL]START TRANSACTION;受影響的行: 0時間: 0.000s[SQL]INSERT INTO test_tab VALUES (1, '2');受影響的行: 1時間: 0.001s[SQL]INSERT INTO test_tab VALUES (1, '3');[Err] 1062 - Duplicate entry '1' for key 'PRIMARY'
咱們看結果能夠知道INSERT INTO test_tab VALUES (1, '3');這一句由於主鍵衝突運行失敗,從而這一條下面的commit也沒有執行。it
須要注意的是:這時已經開啓了一個事務,而且已經執行了一條正確的插入語句,雖然沒有體如今數據庫中,但若是之後在該鏈接中又執行了一條commit 或begin或start transaction(新開一個事務會將該連接中的其餘未提交的事務提交,至關於commit!)你會發現已經將剛纔的INSERT INTO test_tab VALUES (1, '2');寫進了數據庫。io
因此事務的回滾不是這麼理解的,正確的理解應該是,若是事務中全部sql語句執行正確則須要本身手動提交commit;不然有任何一條執行錯誤,須要本身提交一條rollback,這時會回滾全部操做,而不是commit會給你自動判斷和回滾。class