在MySQL5.5以前, 默認的存儲引擎是MyISAM, 在5.5版本以後默認存儲引擎是InnoDB, 而這兩個存儲引擎的最大區別就在於InnoDB是支持事務的, 這也是InnoDB取代MyISAM的重要緣由. 什麼是事務呢? 事務的英文是transaction, 也就是進行一次處理的基本單元, 要麼徹底執行, 要麼全都不執行.數據庫
深刻理解事務, 就須要知道事務的四個特性, 那就是ACID:編程
這四個特性中, 原子性是基礎, 隔離性是手段, 一致性是約束條件, 持久性是目的. 原子性和隔離性好理解, 至於一致性相對難, 筆者開始老是不知道這個一致性所說的狀態是什麼意思, 直到如今看了這個文檔, 才發現.服務器
一致性自己是由具體的業務定義的, 任何寫入數據庫中的數據都須要知足咱們事先定義的約束規則, 到這裏就能夠理解一致性具體的含義了, 一致性其實說的是不違反約束規則, 好比主鍵約束, 惟一約束, 不爲NULL約束等等.日誌
另外一個持久性, 持久性是經過事務日誌來保證的. 日誌包括了回滾日誌和重作日誌. 經過事務對數據進行修改的時候, 首先會將數據庫的變化信息記錄到重作日誌中, 而後再對數據庫中對應的行進行修改, 這樣作的好處是, 即便數據庫崩潰, 數據庫重啓後也能找到沒有更新到數據庫系統中的重作日誌, 從新執行, 從而使事務具備持久性.code
Oracle是支持事務的, 而在MySQL中, 須要選擇合適的存儲引擎才能夠支持事務, 使用MySQL, 可使用SHOW ENGINES
來查看當前MySQL支持的存儲引擎, 以及該引擎是否支持事務.blog
事務經常使用的控制語句:事務
使用事務有兩種方式, 一種是隱式事務, 一種是顯示事務. 隱式事務其實就是自動提交. Oracle默認不自動提交, 須要手寫COMMIT命令, 而MySQL默認自動提交, 可使用MySQL的命令來配置參數關閉自動提交:set autocommit = 0;是關閉自動提交, set autocommit = 1;是開啓自動提交
.ci
MySQL的默認狀態下:文檔
CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB; BEGIN; INSERT INTO test SELECT '關羽'; COMMIT; BEGIN; INSERT INTO test SELECT '張飛'; INSERT INTO test SELECT '張飛'; ROLLBACK; SELECT * FROM test;
CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB; BEGIN; INSERT INTO test SELECT '關羽'; COMMIT; INSERT INTO test SELECT '張飛'; INSERT INTO test SELECT '張飛'; ROLLBACK; SELECT * FROM test;
INSERT INTO test SELECT '張飛';
的時候, 執行完成就會提交, 只有在執行第二個的時候會產生主鍵衝突而回滾.CREATE TABLE test(name varchar(255), PRIMARY KEY (name)) ENGINE=InnoDB; SET @@completion_type = 1; BEGIN; INSERT INTO test SELECT '關羽'; COMMIT; INSERT INTO test SELECT '張飛'; INSERT INTO test SELECT '張飛'; ROLLBACK; SELECT * FROM test;
結果是一條數據, 很明顯, 緣由是SET @@completion_type = 1;
, 這個參數有3種可能:it
這裏使用了completion=1, 就是提交以後, 至關於在下一行寫了START TRANSACTION 或 BEGIN, 這是插入兩次張飛會被認爲是在同一個事務以內的操做, 因此回滾以後, 數據庫中就只有一條關羽的數據.
這個是事務的基本認識, 固然事務的隔離級別也很重要, 下一個隨筆說.