事務是由一系列語句構成的邏輯工做單元。事務和存儲過程等批處理有必定程度上的類似之處,數據庫
一般都是爲了完成必定業務邏輯而將一條或者多條語句「封裝」起來,使它們與其餘語句之間出現一個邏輯上的邊界,並造成相對獨立的一個工做單元。安全
當使用事務修改多個數據表時,若是在處理的過程當中出現了某種錯誤,例如系統死機或忽然斷電等狀況,則返回結果是數據所有沒有被保存。併發
由於事務處理的結果只有兩種:一種是在事務處理的過程當中,若是發生了某種錯誤則整個事務所有回滾,使全部對數據的修改所有撤銷,事務對數據庫的操做是單步執行的,當遇到錯誤時能夠隨時回滾;spa
另外一種是若是沒有發生任何錯誤且每一步的執行都成功,則整個事務所有被提交。從而能夠看出,有效地使用事務不但能夠提升數據的安全性,還能夠加強數據的處理效率。日誌
MySQL 事務主要用於處理操做量大,複雜度高的數據。好比說,在人員管理系統中,你刪除一我的員,你既須要刪除人員的基本資料,也要刪除和該人員相關的信息,如信箱,文章等等,這樣,這些數據庫操做語句就構成一個事務!索引
事務包含四種重要的屬性,被統稱爲ACID(指數據庫事務正確執行的四個基本要素的縮寫)事務
包含:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。ci
一個支持事務(Transaction)的數據庫,必需要具備這四種特性。it
不然在事務過程(Transaction processing)當中沒法保證數據的正確性,交易過程很可能達不到交易方的要求,一個事務必須經過ACID。io
整個事務中的全部操做,要麼所有完成,要麼所有不完成,不可能停滯在中間某個環節。
事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。
一個事務能夠封裝狀態改變(除非它是一個只讀的)。
事務必須始終保持系統處於一致的狀態,無論在任何給定的時間併發事務有多少。
也就是說:若是事務是併發多個,系統也必須如同串行事務同樣操做。
其主要特徵是保護性和不變性(Preserving an Invariant),以轉帳案例爲例,假設有五個帳戶,每一個帳戶餘額是100元,那麼五個帳戶總額是500元
若是在這個5個帳戶之間同時發生多個轉帳,不管併發多少個,好比在A與B帳戶之間轉帳5元,在C與D帳戶之間轉帳10元,在B與E之間轉帳15元,五個帳戶總額也應該仍是500元,這就是保護性和不變性。
隔離狀態執行事務,使它們好像是系統在給定時間內執行的惟一操做。
若是有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認爲只有該事務在使用系統。
這種屬性有時稱爲串行化,爲了防止事務操做間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用於同一數據。
在事務提交完成之後,該事務對數據庫所作的更改便持久的保存在數據庫之中,永久保存下來,並不會被回滾。
因爲一項操做一般會包含許多子操做,而這些子操做可能會由於硬件的損壞或其餘因素產生問題,要正確實現ACID並不容易。
ACID建議數據庫將全部須要更新以及修改的資料一次操做完畢,但實際上並不可行。
目前主要有兩種方式實現ACID:第一種是Write ahead logging,也就是日誌式的方式(現代數據庫均基於這種方式)。第二種是Shadow paging。
相對於WAL(write ahead logging)技術,shadow paging技術實現起來比較簡單,消除了寫日誌記錄的開銷恢復的速度也快(不須要redo和undo)。
shadow paging的缺點就是事務提交時要輸出多個塊,這使得提交的開銷很大,並且以塊爲單位,很難應用到容許多個事務併發執行的狀況——這是它致命的缺點。
WAL 的中心思想是對數據文件 的修改(它們是表和索引的載體)必須是隻能發生在這些修改已經 記錄了日誌以後,也就是說,在日誌記錄沖刷到永久存儲器以後。
若是咱們遵循這個過程,那麼咱們就不須要在每次事務提交的時候 都把數據頁沖刷到磁盤,由於咱們知道在出現崩潰的狀況下,
咱們能夠用日誌來恢復數據庫:任何還沒有附加到數據頁的記錄都將先從日誌記錄中重作(這叫向前滾動恢復,也叫作 REDO) 而後那些未提交的事務作的修改將被從數據頁中刪除 (這叫向後滾動恢復 - UNDO)。