前言
什麼是冪等性?一次和多次請求某一個資源,對資源本身所產生的的影響均與一次執行的影響相同。
冪等性是系統服務對外的一種承諾,承諾只要呼叫介面成功了,多次呼叫對系統的影響是一致的。
冪等性與重複提交比較
冪等性 更多使用的情況是第一次請求知道結果,但是由於網路抖動或連線超時等情況未進行正常返回,在這種情況下系統自動再次發起請求,其目的是確認第一次是否請求完成。
重複提交 更多使用的情況是第一次請求成功或請求結果暫未返回的情況下,人為的進行多次操作。
SQL 語句冪等性
SELECT
SELECT * FROM `user` WHERE id = 1
無論執行多少次都不會對資源造成影響,查詢具有天然的冪等性。
UPDATE
UPDATE `user` SET status = 1 WHERE id = 1;
無論執行成功多少次狀態都是一致的,這種場景是冪等操作。
UPDATE `user` SET score = score+1 WHERE id = 1;
每次執行的結果都會發生變化,這種場景不是冪等操作。
根據具體場景看能否寫成這樣的 SQL
:
UPDATE `user` SET score = score+1 WHERE id = 1 AND score = 59;
無論執行成功多少次分數都是一致的,這種場景是冪等操作。
DELETE
DELETE FROM `user` WHERE id = 1;
無論執行成功多少次資料都是一致的,這種場景是冪等操作。
INSERT
INSERT INTO `user` (`name`, `status`, `score`) VALUES ('tom', 1, 80);
每次執行的結果都會發生變化,這種場景不是冪等操作。
根據具體場景看能否為 name
建立一個唯一索引,或執行型別這樣的 SQL
:
INSERT INTO ... values ... ON DUPLICATE KEY UPDATE ...
// 注意,要使用這條語句,前提條件是這個表必須有一個唯一索引或主鍵。
實現方案
方案一
下游系統提供相應查詢介面。
上游系統在 timeout
後,首先去查詢一下,如果查到了,就表明已經做了,成功了就不用做了,失敗了就走失敗流程。
方案二
將這個查詢操作交給下游系統,上游系統只管重試,下游系統保證一次和多次的請求產生的影響是一樣的。這時我們就說下游系統提供的介面支援冪等性。
小結
冪等性關注的是多次請求是否對資源產生了副作用,而不是關注的結果。SELECT
語句有可能每次查詢的資料不一致,但是它是冪等性的。
關於 實現方案 -> 方案二 的具體實現方案,根據業務的實際情況考慮合適的解決方案,比如:通過 SQL
語句就可以實現冪等,就沒必要引入 全域性唯一ID
的解決方案。