酸堿平衡理論
酸(ACID)堿(BASE)平衡中的酸指的就是事務的ACID四個特性隅要,也是保證關系型數據庫強一致性的基礎;堿可以拆分為BA(基本可用)董济、S(軟狀態(tài))步清、E(最終一致)三個方面,解決了分布式系統(tǒng)中對高可用和數據一致的問題虏肾。
下面將對ACID和BASE進行介紹和一些案例的講解
ACID
眾所周知廓啊,ACID代表了事務的四個特性,即原子性封豪、一致性谴轮、隔離性、持久性吹埠。
具有ACID的數據庫支持強一致性第步,即數據庫本身不會出現不一致的情況,每個事務都是原子的缘琅,要么成功要么失敗粘都,不同事務之間互相隔離不受影響,且數據最后會持久化落盤胯杭,因此數據庫會從一個明確的狀態(tài)轉移到另一個明確的狀態(tài)驯杜,中間的臨時狀態(tài)是不會影響數據的最終結果的受啥,一般是通過多版本控制協(xié)議(MVCC)來實現的做个。
針對前一篇文章中提到的案例1,我們可以使用關系型數據庫來實現數據的一致性」鼍郑現在我們假設有兩張表居暖,分別為庫存表和訂單表,那么我們一次下單的事務如下
// 開啟一個事務
start transaction with CONSISTENT SNAPSHOT;
// 插入一條訂單
insert into order_1(id, sp_id, status) values (2,'ttt',0);
// 查詢商品庫存
select count from kucun where sp_id = 'ttt';
// 更新庫存(失敗則回滾)
update kucun set count = count - 1 where sp_id = 'ttt';
// 下單成功(失敗則回滾)
update order_1 set status = 1 where id = 2;
// 提交事務
commit;
可以看出這是一個強一致性的事務藤肢,庫存或者下單失敗太闺,都會回滾當前事務,且更新時會持有行鎖嘁圈,該行記錄也不會被其他事務更新掉省骂。在數據量小的系統(tǒng)中蟀淮,可以采用這種方案。
在互聯(lián)網大規(guī)模钞澳、高并發(fā)的場景下怠惶,單機系統(tǒng)性能瓶頸容易達到上限,因此必須用到拆分的理念轧粟,數據庫拆分策略一般是分庫分表策治,那么在分庫分表后如果還是想使用ACID特性的話,就必須把同一商品的訂單和庫存都映射到同一個數據庫分片上兰吟。但是現實往往事與愿違通惫,由于業(yè)務規(guī)則的限制,我們很可能無法將相關數據分到同一個數據庫分片混蔼,這時就需要實現最終一致性履腋。