A-->B前端
A在發送請求以前,用樂觀鎖,減小對B的重複調用,這樣必定程度上是冪等性。數據庫
好比A系統支付功能,要調用B系統進行支付操做,可是前端對"支付"按鈕不進行控制,即用戶會不斷屢次點擊支付按鈕,這時A系統會不斷的發送請求給B系統(每點擊一次就發送一次),若是B系統沒有作冪等性設計,那就出問題了,以下圖1所示:bash
圖1 用戶的屢次請求在A系統中觸發了不少個線程,A也對應的屢次調用B線程
咱們是否能夠在A系統就把相同的線程過濾掉,以下圖2所示:設計
圖2 用戶的屢次請求在A系統中觸發了不少個線程,可是都被A過濾了,最後發到B的只有一個請求code
圖2中的是怎麼實現的呢,能夠在A系統的數據庫中建立一張表,因爲A系統中支付,因此必定存在一個訂單Id,咱們就使用這個訂單Id,加上版本號,來生成一條記錄,這樣屢次支付同一個訂單的請求,就只有一個線程會發送到B。用了數據庫的樂觀鎖。blog
+----------+------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+------------+------+-----+---------+----------------+ | id | bigint(20) | NO | PRI | NULL | auto_increment | | order_id | bigint(20) | YES | | NULL | | | version | int(11) | YES | | 0 | | +----------+------------+------+-----+---------+----------------+ 3 rows in set (0.00 sec)
每一個線程都執行update table set version=version+1 where order_id=#{orderId};這個就經過樂觀鎖,只有一個線程會成功修改這條記錄,咱們只讓修改version成功的那個線程發送請求到B。rem