国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

成都網(wǎng)站開發(fā)排名廈門關(guān)鍵詞排名優(yōu)化

成都網(wǎng)站開發(fā)排名,廈門關(guān)鍵詞排名優(yōu)化,discuz做商城網(wǎng)站,做神馬網(wǎng)站優(yōu)化快速排名軟件啥是冪等? 客戶端對(duì)同一API的多次調(diào)用應(yīng)該產(chǎn)生相同的服務(wù)器狀態(tài)。 通俗的說:某個(gè)行為重復(fù)的執(zhí)行,最終獲取的結(jié)果是相同的,不會(huì)因?yàn)橹貜?fù)執(zhí)行對(duì)系統(tǒng)造成變化。 比如說同步數(shù)據(jù)的功能,重復(fù)可以重復(fù)同步,如果…

啥是冪等?

客戶端對(duì)同一API的多次調(diào)用應(yīng)該產(chǎn)生相同的服務(wù)器狀態(tài)。
通俗的說:某個(gè)行為重復(fù)的執(zhí)行,最終獲取的結(jié)果是相同的,不會(huì)因?yàn)橹貜?fù)執(zhí)行對(duì)系統(tǒng)造成變化。

比如說同步數(shù)據(jù)的功能,重復(fù)可以重復(fù)同步,如果可以就表示是冪等的。

常見場(chǎng)景

??HTTP方法??:
冪等方法:GET、PUT、DELETE
非冪等方法:POST、PATCH
??支付系統(tǒng)??:重復(fù)支付請(qǐng)求不應(yīng)導(dǎo)致多次扣款
??訂單創(chuàng)建??:重復(fù)提交訂單不應(yīng)創(chuàng)建多個(gè)相同訂單

實(shí)現(xiàn)冪等性的方法

??唯一標(biāo)識(shí)符??:為每個(gè)操作分配唯一ID,服務(wù)器記錄已處理ID
??版本號(hào)/時(shí)間戳??:資源更新時(shí)攜帶版本信息
??狀態(tài)機(jī)??:確保操作只在特定狀態(tài)下執(zhí)行
??數(shù)據(jù)庫約束??:利用唯一索引防止重復(fù)數(shù)據(jù)

具體

1 update + where,利用數(shù)據(jù)庫的行級(jí)鎖保證查詢和更新是原子性的。偽代碼如下。

String rechargeId = "充值訂單id";// 根據(jù)rechargeId去找充值記錄,如果已處理過,則直接返回成功
RechargePO rechargePo = select * from t_recharge where id = #{rechargeId};// 充值記錄已處理過,直接返回成功
if(rechargePo.status==1){return "SUCCESS";
}開啟Spring事務(wù)// 下面這個(gè)sql是重點(diǎn),重點(diǎn)在where后面要加 status = 0 這個(gè)條件;count表示影響行數(shù)
int count = (update t_recharge set status = 1 where id = #{rechargeId} and status = 0);// count = 1,表示上面sql執(zhí)行成功
if(count!=1){// 走到這里,說明有并發(fā),直接拋出異常throw new RuntimeException("系統(tǒng)繁忙,請(qǐng)重試")
}else{//給賬戶加錢update t_account set balance = balance + #{rechargePo.price} where id = #{rechargePo.accountId}
}提交Spring事務(wù)

2 基于版本號(hào)的樂觀鎖

String rechargeId = "充值訂單id";// 根據(jù)rechargeId去找充值記錄,如果已處理過,則直接返回成功
RechargePO rechargePo = select * from t_recharge where id = #{rechargeId};// 充值記錄已處理過,直接返回成功
if(rechargePo.status==1){return "SUCCESS";
}開啟Spring事務(wù)// 期望的版本號(hào)
Long exceptVersion = rechargePo.version;// 下面這個(gè)sql是重點(diǎn),重點(diǎn)在set后面要有version = version + 1,where后面要加 status = 0 這個(gè)條件;count表示影響行數(shù)
int count = (update t_recharge set status = 1,version = version + 1 where id = #{rechargeId} and version = #{exceptVersion});// count = 1,表示上面sql執(zhí)行成功
if(count!=1){// 走到這里,說明有并發(fā),直接拋出異常throw new RuntimeException("系統(tǒng)繁忙,請(qǐng)重試")
}else{//給賬戶加錢update t_account set balance = balance + #{rechargePo.price} where id = #{rechargePo.accountId}
}提交spring事務(wù)

3 關(guān)聯(lián)一個(gè)唯一約束輔助表

-- 冪等輔助表
create table if not exists t_idempotent
(id             varchar(50) primary key comment 'id,主鍵',idempotent_key varchar(200) not null comment '需要確保冪等的key',unique key uq_idempotent_key (idempotent_key)
) comment '冪等輔助表';

重點(diǎn)關(guān)注第二個(gè)字段idempotent_key,這個(gè)字段添加了唯一約束,說明同時(shí)向這個(gè)表中插入同樣值的idempotent_key,則只有一條記錄會(huì)執(zhí)行成功,其他的請(qǐng)求會(huì)報(bào)異常,而失敗,讓事務(wù)回滾。

String rechargeId = "充值訂單id";// 根據(jù)rechargeId去找充值記錄,如果已處理過,則直接返回成功
RechargePO rechargePo = select * from t_recharge where id = #{rechargeId};// 充值記錄已處理過,直接返回成功
if(rechargePo.status==1){return "SUCCESS";
}// 生成idempotentKey,這里可以使用,業(yè)務(wù)id:業(yè)務(wù)類型,那么我們這里可以使用rechargeId+":"+"RECHARGE_CALLBACK"
String idempotentKey = rechargeId+":"+"RECHARGE_CALLBACK";// 冪等表是否存在記錄,如果存在說明處理過,直接返回成功
IdempotentPO idempotentPO = select * from t_idempotent where idempotent_key = #{idempotentKey};
if(idempotentPO!=null){return "SUCCESS";
}開啟Spring事務(wù)(這里千萬不要漏掉,一定要有事務(wù))// count表示影響行數(shù),這個(gè)sql比較特別,看起來并發(fā)會(huì)出現(xiàn)問題,實(shí)際上配合唯一約束輔助表,就不會(huì)有問題了
int count = update t_recharge set status = 1 where id = #{rechargeId};// count != 1,表示未成功
if(count!=1){// 走到這里,直接拋出異常,讓事務(wù)回滾throw new RuntimeException("系統(tǒng)繁忙,請(qǐng)重試")
}else{//給賬戶加錢update t_account set balance = balance + #{rechargePo.price} where id = #{rechargePo.accountId}
}String idempotentId = "";
// 這里是關(guān)鍵一步,向 t_recharge 插入記錄,如果有并發(fā)過來,只會(huì)有一個(gè)成功,其他的會(huì)報(bào)異常導(dǎo)致事務(wù)回滾,上面的
insert into t_recharge (id, idempotent_key) values (#{idempotentId}, #{idempotentKey});提交spring事務(wù)
http://m.aloenet.com.cn/news/39638.html

相關(guān)文章:

  • 北京網(wǎng)站設(shè)計(jì)首選 新鴻儒360免費(fèi)建站教程
  • wordpress標(biāo)簽生成圖片基礎(chǔ)建站如何提升和優(yōu)化
  • wordpress 連接后臺(tái)關(guān)鍵詞優(yōu)化公司費(fèi)用多少
  • 網(wǎng)站內(nèi)移動(dòng)的圖片怎么做的深圳網(wǎng)絡(luò)優(yōu)化公司
  • 公司備案網(wǎng)站負(fù)責(zé)人是誰網(wǎng)站推廣軟件哪個(gè)好
  • 淄博張店做網(wǎng)站的公司百度網(wǎng)站客服電話
  • 網(wǎng)站建設(shè)新聞發(fā)布注意事項(xiàng)互聯(lián)網(wǎng)怎么賺錢
  • 建設(shè)網(wǎng)站的英語怎么說做網(wǎng)站的網(wǎng)絡(luò)公司
  • 微信小程序頁面模板seo文章是什么
  • 廣水市建設(shè)局網(wǎng)站線上培訓(xùn)
  • 建設(shè)網(wǎng)站的方案什么叫做優(yōu)化
  • rust做網(wǎng)站微商引流被加方法精準(zhǔn)客源
  • 如何建設(shè)成為營銷網(wǎng)站百度客服電話24小時(shí)人工服務(wù)熱線
  • 向日葵域名怎么做網(wǎng)站成都網(wǎng)站搭建優(yōu)化推廣
  • 手機(jī)動(dòng)態(tài)網(wǎng)站開發(fā)教程網(wǎng)絡(luò)營銷的四大特點(diǎn)
  • 如何做網(wǎng)站本地服務(wù)器嗎廣告投放策略
  • 江蘇省建設(shè)人才網(wǎng)站軟文文案案例
  • 蘭州新站seo如何找推廣平臺(tái)
  • 假網(wǎng)站怎么做呢百度信息流投放技巧
  • 怎么提高網(wǎng)站曝光武漢seo優(yōu)化服務(wù)
  • 高能建站系統(tǒng)怎么收費(fèi)查詢網(wǎng)站流量的網(wǎng)址
  • 網(wǎng)站備案沒公司網(wǎng)絡(luò)口碑營銷的成功案例
  • 主流跨境電商平臺(tái)有哪些?山東服務(wù)好的seo
  • 做酒店網(wǎng)站的公司百度一下子就知道了
  • 個(gè)人網(wǎng)站怎么做視頻人工智能培訓(xùn)心得
  • 北京網(wǎng)頁制作網(wǎng)站搜索引擎網(wǎng)站優(yōu)化推廣
  • 專用主機(jī)網(wǎng)站建設(shè)企業(yè)郵箱域名
  • 鹽城網(wǎng)站建設(shè)流程百度在線使用網(wǎng)頁版
  • WordPress 升級(jí) php蘇州百度快速排名優(yōu)化
  • 頭條號(hào)可以做網(wǎng)站鏈接嗎最近的新聞大事10條