隨着大數據的到來,分佈式處理變得越來越火,而且分佈式中的一致性事務又是重中之重。當然我們今天的重點不在於介紹如何保證分佈式事務中的一致性,而是在保證事務一致性的過程中會出現一系列的補償機制,這就涉及到了冪等。接下來讓我們一起去看一下吧。
一、冪等
1、概念
在編程中.一個冪等操作的特點是其任意多次執行所產生的影響均與一次執行的影響相同。冪等函數,或冪等方法,是指可以使用相同參數重複執行,並能獲得相同結果的函數。這些函數不會影響系統狀態,也不用擔心重複執行會對系統造成改變。
在實際應用中,最常用的就是去重。
2、分佈式系統中的冪等處理
插入數據的唯一索引
插入數據的唯一性,可以通過業務主鍵來進行約束,例如一個特定的業務場景,三個字段肯定確定唯一性,那麼,可以在數據庫表添加唯一索引來進行標示。
如果涉及到的去重的地方特別多,例如ERP系統中有各種各樣的業務單據,每一種業務單據都需要去重,這時候,可以單獨搞一張去重表,在插入數據的時候,插入去重表,利用數據庫的唯一索引特性,保證唯一的邏輯。
分佈式鎖
還是拿插入數據的例子,如果是分佈是系統,構建唯一索引比較困難,例如唯一性的字段沒法確定,這時候可以引入分佈式鎖,通過第三方的系統,在業務系統插入數據或者更新數據,獲取分佈式鎖,然後做操作,之後釋放鎖,這樣其實是把多線程併發的鎖的思路,引入多多個系統,也就是分佈式系統中得解決思路。
狀態機冪等
在設計單據相關的業務,或者是任務相關的業務,肯定會涉及到狀態機,就是業務單據上面有個狀態,狀態在不同的情況下會發生變更,一般情況下存在有限狀態機,這時候,如果狀態機已經處於下一個狀態,這時候來了一個上一個狀態的變更,理論上是不能夠變更的,這樣的話,保證了有限狀態機的冪等。
二、索引
1、概念
在關係數據庫中,索引是一種與表有關的數據庫結構,它可以使對應於表的SQL語句執行得更快。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
2、類型
唯一索引
唯一索引是不允許其中任何兩行具有相同索引值的索引。 當現有數據中存在重複的鍵值時,大多數數據庫不允許將新創建的唯一索引與表一起保存。數據庫還可能防止添加將在表中創建重複鍵值的新數據。例如,如果在 employee 表中職員的姓 (lname) 上創建了唯一索引,則任何兩個員工都不能同姓。
非唯一索引
非唯一索引是相對唯一索引,允許其中任何兩行具有相同索引值的索引。 當現有數據中存在重複的鍵值時,數據庫是允許將新創建的索引與表一起保存。這時數據庫不能防止添加將在表中創建重複鍵值的新數據。
主鍵索引
數據庫表經常有一列或列組合,其值唯一標識表中的每一行。該列稱爲表的主鍵。 在數據庫關係圖中爲表定義主鍵將自動創建主鍵索引,主鍵索引是唯一索引的特定類型。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對數據的快速訪問。
聚集索引(也叫聚簇索引)
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個聚集索引。 如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的數據訪問速度。
3、優點
大大加快數據的檢索速度;
創建唯一性索引,保證數據庫表中每一行數據的唯一性;
加速表和表之間的連接;
在使用分組和排序子句進行數據檢索時,可以顯著減少查詢中分組和排序的時間。
4、缺點
索引需要佔物理空間。
當對錶中的數據進行增加、刪除和修改的時候,索引也要動態的維護,降低了數據的維護速度。
總結:
我們瞭解了索引之後就能實現冪等了,從而可以避免重複插入。這在電商或者其他的項目中,處理重複的訂單就簡單多了。當然,我們利用數據庫的唯一索引來實現冪等只是其中的一種方法,在其他情況下,我們還可以通過其他方法來做冪等,這裏不再敘說,以後遇到再與大家分享。