分布式事務?咱先弄明白本地事務再說 - ACID



 

 

過去一段時間面試的同學,對於數據庫事務,可以按照配置正常使用,但很多都無法講清楚和理解數據庫事務這個東西真正的意義,以及互聯網興起以后,當今數據庫在ACID面前面臨怎樣的問題和抉擇。

事務,是各大單機SQL數據庫廠商包括Oracle、IBM DB2等,早在上世紀80年代提出的一個解決 數據並發操作處理的模型 ,旨在滿足多用戶(多線程、進程)對數據操作的場景下,依然能保證邏輯正確執行,狀體持久,且各大廠商提出,並在事務實現上都遵循事務的 ACID 4個特性。

回顧ACID

 

 

 

一個模塊,是多個獨立的功能邏輯的組合,每個功能包含多個操作步驟,包括IO、計算、數據庫等操作,必須保證每一步都被執行,且執行正確,這個功能和模塊才是可用,可交付的。

 

 

 

那么,如何保證這些操作的完整性,就是Atomic,定義為一個原子操作,全部執行且成功,或者全部失敗都不執行(回滾),原子操作如果成功,那狀態就必須持久,被稱為數據庫的Durability,持久性。

原子性A、持久性D,這倆個都比較好理解,定義了事務的邊界,行為的開始和行為的結束。

A、D定義了事務的邊界,那一致性C、隔離性I,就是對事務中間狀態的管理,

 

一致性,也可以理解為是數據的完整性,數據的有效性,我們舉例來說明什么是一致性,以及事務是如何保證一致性的,

  • 一個賬戶減100,另一個賬戶加100的時候,程序異常crash了,這時候就出現數據的不一致情況,破壞了有效性,這個問題可以由Atomic來保證;
  • 一個原子操作在執行的過程中,涉及多個數據變更的中間狀態的保護,例如把A賬戶減100,在加到B賬戶完成這個原子操作之前,此時,其他線程對A讀的操作就有可能獲取到A少100的這個中間狀態,這種情況是否允許發生,由Isolation來保證;
  • 數據庫延遲約束,例如數據字段的類型、空值、關系、數據范圍、主鍵唯一性等這些合法性的檢查都是由Durability來保證,在事務commit時,發現數據不合法,是無法提交成功的。

 

所以,綜上所述,一致性C,是數據狀態的正確變換的保證,AID,是實現C的手段,也是我們真正要追求的目標。

 

而,隔離性I的設定,就是對一致性C不同程度的破壞,事實上,如果我們順序對數據進行讀寫,ACD是完全可用保證的,但這樣效率會非常的低下,那,我們是要嚴格的一致性,還是更高的效率,數據庫專家們把這個決定權交給了用戶,所以,我們看到,ACID當中,只有隔離性I是用戶可以選擇的,可以自定義的。
隔離性包括 串行讀、讀已提交、重復讀、讀未提交 等幾種策略,性能由低到高,讓用戶在不同的使用場景,選擇合適的隔離策略,在一致性和性能之間平衡,取得最好的綜合表現。

 

小結

本文主要介紹了事務和事務的幾個特性,解釋了ACID的由來和之間的關系,

總的來說,ACID的核心是C,大家其實都是為得到C而提出的不同緯度的限制和規范,A確定一個功能的完整性,D對狀態負責,I可以說是C的等級系數,不同的I的策略,會出現不同的級別的C,AID是數據庫本身的功能特性,C由業務層把控,要嚴格的C,就設置完整的數據庫約束和串行隔離,反之,要寬松的C,就放開數據庫的約束,使用讀未提交的隔離策略,存在即合理,后者更適用於互聯網高並發對一致性要求不高的場景,例如分布式的AP系統,可以保證服務整體的響應時間和服務的可用性。

 


免責聲明!

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



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