數據庫事務的四大特寫(ACID)

基本概念介紹:html

事務:是數據庫操做的最小工做單元,是做爲單個邏輯工做單元執行的一系列操做;這些操做做爲一個總體一塊兒向系統提交,要麼都執行、要麼都不執行;事務是一組不可再分割的操做集合(工做邏輯單元);(參見:事務是什麼數據庫

原子性(Atomicity):原子性是指事務包含的全部操做要麼所有成功,要麼所有失敗回滾,這和前面兩篇博客介紹事務的功能是同樣的概念,所以事務的操做若是成功就必需要徹底應用到數據庫,若是操做失敗則不能對數據庫有任何影響。 併發

一致性(Consistency):一致性是指事務必須使數據庫從一個一致性狀態變換到另外一個一致性狀態,也就是說一個事務執行以前和執行以後都必須處於一致性狀態。日誌

隔離性(Isolation):隔離性是當多個用戶併發訪問數據庫時,好比操做同一張表時,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做所幹擾,多個併發事務之間要相互隔離。htm

持久性(Durability):持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即使是在數據庫系統遇到故障的狀況下也不會丟失提交事務的操做。blog

使用事務的緣由:事務

這是一個充滿意外的世界,一件事情的發展除了取決於咱們的計劃外也取決於事情發生過程當中發生的對事情發展形成影響的意外。而事務的出現就是爲了儘量的避免意外的發生,是事情儘量的按照咱們計劃的過程進行發展。而事務的4個特性的來由咱們能夠經過下面的「慄」子來大略的進行理解:ci

在一次交易中甲須要向乙轉帳1000元,而轉帳的過程以下:
一、交易系統查看甲的帳號餘額是否超過1000元,若是是則繼續,不然沒法進行轉帳;
二、系統從甲的帳號中扣除1000元;
三、系統向乙的帳號中加入1000元。
若是這個過程當中不加任何限制可能存在如下情況:
一、系統查詢到甲帳號餘額小於1000元,沒法進行轉帳;
二、系統查詢到甲帳號餘額超過1000元並順利進行轉帳;
三、系統查詢到甲帳號餘額超過1000元進行轉帳,可是系統執行到步驟2出錯了,致使甲被扣除了1000元,而乙未收到錢;
四、系統檢測到甲帳號餘額超過1000元進行轉帳,可是在不在3中因爲系統出錯向乙中帳號轉入的是1001元;
五、系統檢測到甲帳號餘額超過1000元進行轉帳,可是這個時候有人用加的帳號取走了部分錢致使扣款失敗;
六、系統檢測到甲帳號餘額超過1000元並順利轉帳,可是以後的某個時間存儲信息的系統發生故障時間在通過搶修後恢復到轉帳前的數據;
。。。。。。意外狀況太多這裏就只列舉其中的幾個get

分析:在交易過程當中前兩種狀況均屬於計劃中的狀況,然後3中狀況則是咱們須要避免的意外狀況。爲了不狀況3的出現,咱們須要規定每次轉帳必須完成全部步驟,不然就什麼都不作,而這對應的正是原子性的特性;爲了不狀況4,咱們須要規定系統扣除的甲的金額應該等於乙帳號中增長的金額,從而保證轉帳過程當中所涉及到的兩個帳號種的金額在操做的過程當中保持不變,而這對應的是事務的一致性;爲了不狀況5的出現,咱們須要規定在本次轉帳的過程當中該帳號不一樣進行其餘的轉帳操做,這對應的是事務的隔離性;爲了不狀況6的出現,咱們須要對已經完成的操做進行備份,從而避免數據信息的丟失,這對應的是事務的持久性。博客

四大特性實現原理:

事務的ACID特性主要經過併發控制日誌恢復兩種方式來共同實現。其中併發控制技術經過鎖機制來保證了事務的隔離性,使數據庫的一致性狀態不會由於併發執行的操做被破壞。日誌恢復技術經過將事務執行的過程按順序記錄在日誌中來使一致性狀態不會因事務或系統故障被破壞;同時使已提交的對數據庫的修改不會因系統崩潰而丟失,保證了事務的持久性。另外,數據庫經過提交回滾兩個動做來對數據庫的操做信息進行管理,在一個事務未提交以前事務的操做信息只寫在日誌上,只有當事務全部操做均完成之後執行提交纔會對數據庫中的數據進行實際的操做,而當事務執行失敗時,數據庫調用回滾操做對日誌上記錄的該記錄的操做進行刪除,從而達到一個事務要麼所有完成,要麼什麼都不作的目的,即實現事務的原子性