數據庫中的事務是什么?


事務(transaction)是作為一個單元的一組有序的數據庫操作。如果組中的所有 

操作都成功,則認為事務成功,即使只有一個操作失敗,事務也不成功。如果所 

有操作完成,事務則提交,其修改將作用於所有其他數據庫進程。如果一個操作 

失敗,則事務將回滾,該事務所有操作的影響都將取消。

事務特性:

1、原子性:即不可分割性,事務要么全部被執行,要么就全部不被執行。

2、一致性或可串性。事務的執行使得數據庫從一種正確狀態轉換成另一種正確狀 

3、隔離性。在事務正確提交之前,不允許把該事務對數據的任何改變提供給任何 

其他事務,

4、持久性。事務正確提交后,其結果將永久保存在數據庫中,即使在事務提交后 

有了其他故障,事務的處理結果也會得到保存。

或者這樣理解:

事務就是被綁定在一起作為一個邏輯工作單元的 SQL 語句分組,如果任何一個語 

句操作失敗那么整個操作就被失敗,以后操作就會回滾到操作前狀態,或者是上 

有個節點。為了確保要么執行,要么不執行,就可以使用事務。要將有組語句作 

為事務考慮,就需要通過 ACID 測試,即原子性,一致性,隔離性和持久性。

 

參考網址: https://www.jianshu.com/p/2c30d1fe5c4e

 

理解數據庫的事務,ACID,CAP和一致性

geekpy
22018.01.08 15:20:41字數 2,748閱讀 22,548

什么是事務

事務是指由一系列數據庫操作組成的一個完整的邏輯過程,這個過程中的所有操作要么都成功,要么都不成功。比如:常見的例子就是銀行轉賬的例子,一次轉賬操作會包含多個數據庫操作,而這些數據庫操作需要放到一個事務當中,保證其要么都成功,要么都不成功。

什么是ACID

ACID是事務的四個特性,指的是atomicity,原子性;consistency,一致性;isolation,隔離性;durability,持久性。

  1. 原子性(atomicity): 指所有在事務中的操作要么都成功,要么都不成功,所有的操作都不可分割,沒有中間狀態。一旦某一步執行失敗,就會全部回滾到初始狀態。
  2. 一致性(consistency): 指的是邏輯上的一致性,即所有操作是符合現實當中的期望的。具體參考下一節
  3. 隔離性(isolation): 即不同事務之間的相互影響和隔離的程度。比如,不同的隔離級別,事務的並發程度也不同,最強的隔離狀態是所有的事務都是串行化的(serializable)(即一個事務完成之后才能進行下一個事務),這樣並發性也會降到最低,在保證了強一致性的情況下,性能也會受很大影響,所以在實際工程當中,往往會折中一下。
  4. 持久性(durability): 可以簡單地理解為事務執行完畢后數據不可逆並持久化存儲於存儲系統當中

理解一致性

實際上我們通常說的數據庫事務的一致性和分布式系統的一致性並不是一個概念。這里可以區分成“內部一致性”和“外部一致性”。“內部一致性”搞數據庫的人很少這么說,一般就直接說一致性,更准確的說是“Consistency in ACID”(“事務 ACID 屬性中的一致性”);“外部一致性”是針對分布式系統而言的,分布式領域提及的 Consistency 表示系統的正確性模型,著名的也是臭名昭著的 CAP 理論中的 C 就是這個范疇的。這主要是由於分布式系統寫入和讀取都可能不在同一台機器上,而這必然會有一段時間導致不同機器上所存的數據不一致的情況,這就是所謂的“不一致時間窗口”。

內部一致性

要理解內部一致性也就是我們通常所說的ACID中的一致性,就必須從反面考慮什么情況下是不一致的。不一致的情況主要有以下幾種情況:

 

 

 
 
丟失修改、不可重復讀、臟讀
  • 修改丟失:丟失修改是事務A和B先后更改數據數據x(假設初始是x0),但是在A未正式更改前,B已經讀取了原先的數據x0,最后A更改后為x1,B更改的並不是A更新后的x1,而是更改的x0,更改后假設為x2,這時x2將x1覆蓋了,相當於事務A針對x的更改丟失了。
  • 臟讀: 事務T1讀取了T2更改的x,但是T2在實際存儲數據時可能出錯回滾了,這時T1讀取的實際是無效的數據,這種情況下就是臟讀
  • 不可重復讀:是說在T1讀取x時,由於中間T2更改了x,所以T1前后兩次讀取的x值不相同,這就是所謂的不可重復讀
  • 幻讀:在T1讀取符合某個條件的所有記錄時,T2增加了一條符合該條件的記錄,這就導致T1執行過程中前后讀取的記錄可能不一致,即T2之后讀取時會多出一條記錄。

其中前三種(丟失修改、不能重復讀、臟讀)都是由於並發事務在修改同一份數據的時候導致的問題,此類問題可以通過對同一個資源加鎖的方式來解決,而最后一種情況是由於不同事務並發時,新增數據導致的問題,對於新增的記錄是無法加鎖的,此種情況只能通過事務的串行化來解決。而串行化與並發是矛盾的,所以要在性能和事務的一致性強度上取得一個平衡,就涉及到不同的隔離等級,關於隔離等級,詳見理解隔離性一節。

外部一致性

在分布式系統中我們所說的一致性,也就是外部一致性,通常會分為強一致性,弱一致性,還有最終一致性,而要理解外部一致性,需要對CAP理論(Consistency,Availability和Partition Tolerance)有所了解,關於CAP詳見CAP定理一節。

  • 強一致性:指系統中的某個數據被成功更新后,后續任何對該數據的讀取操作都將得到更新后的值
  • 弱一致性:弱一致性是相對於強一致性而言,它不保證總能得到最新的值;
  • 最終一致性:是弱一致性的特殊形式,即保證在沒有新的更新的條件下,經過一段“不一致時間窗口”,最終所有的訪問都是最后更新的值。最常見的是DNS服務,更新域名指向的機器后,多級緩存要等到expiration time的時候才會更新,但是隨着時間的推移,最終數據會趨於一致。

理解隔離性

事務的隔離級別從低到高有
讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)

  • Read Uncommitted:事務讀數據時不會加鎖,寫數據時會有行級共享鎖。假設事務1先於事務2,當事務1更新數據的時候,事務2可以讀取事務1未提交的數據,但是不能更新事務1正在更新的數據。而如果事務1只是讀數據,那么事務2既可以讀數據,也可以更新數據。
    這種情況下無法規避臟讀,不可重復讀的問題。
  • Read Committed:即在一個事務修改數據過程中,如果事務還沒提交,其他事務不能讀該數據,或者說只能讀取committed的數據。事務讀數據的瞬間會加行級共享鎖,一旦讀完該行,立即釋放該行級共享鎖;而寫數據的瞬間會加行級排它鎖,直到事務結束。這種情況下就避免了臟讀,但是卻不能避免不可重復讀的問題
  • Repeatable Read:當然就再升一級,為的就是避免不可重復讀的問題,所以名字叫repeatable read。怎么實現的呢,我們知道read committed是,事務讀操作只在讀的一瞬間加鎖,讀完這行就釋放鎖了,而repeatable read級別是讀的一瞬間加鎖,但是一直到事務結束才釋放鎖。但是repeatable read不能解決幻讀的問題,因為幻讀是增加記錄,並不是更改原先的記錄。
  • Serialization:到達這一級別的隔離,可以徹底解決一致性的所有問題。一般來說是通過加表鎖來解決串行化的問題。

CAP定理

CAP理論主要是針對分布式存儲系統的,C是指Consistency一致性,A是指Availability可用性,P是指Partition tolerance分區容忍性。CAP定理認為分布式系統中這三個特性最多只能同時滿足兩個特性。下面我們來分別看下這三個特性究竟是什么意思。

 

 

 

 

 
CAP
  • 一致性(Consistency): 指在分布式系統中的所有數據備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的數據副本)
  • 可用性(Availability): 在集群中一部分節點故障后,集群整體是否還能響應客戶端的讀寫請求。(對數據更新具備高可用性)
  • 分區容忍性(Partition tolerance): 即當節點之間無法正常通信時,就產生了分區,而分區產生后,依然能夠保證服務可用,那么我們就說系統是分區容忍的。顯然如果節點越多,且備份越多,分區容忍度就越高(因為即便是其中一個或多個節點掛了,仍然有其它節點和備份可用)。

那么,為什么說三個特性無法全部保證呢?首先,假如我們要保證分區容忍性,必然要做多個副本節點,而這必然會帶來一致性的問題,即保證多個節點的數據是相同的,但是,要讓多個節點數據相同,就必須要花時間去復制數據,這還是能夠正常通信的情況下,那么在數據復制的過程中為了保持一致性,就不能對外提供服務,所以這段時間就無法滿足可用性的問題。
實際工程通常會采取一些折中措施,比如並不保證強一致性,只保證最終一致性,什么意思呢?比如,有三個數據節點互為備份,某份數據在節點A更改后,需要將更改復制到節點B和C,假設復制過程中,有客戶訪問該數據,那么此時不保證是一致的,即訪問A節點的用戶得到的是最新數據,而訪問B和C節點的用戶得到是老數據,但是最終,數據會復制完成,所以最終A、B、C三個節點的數據是一致的。(比如像文章點贊這種數據,延遲下也沒有關系啦)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM