摘要:對單一余額的高并發操作自然不是正常人發起的,系統正在承受攻擊,或者自以為是的使用了。類似于當然,你也可以通過加入版本號概念,而不是余額字段來控制這個過程,但都類似。變種版本號通過在表中加一個額外的字段,來控制并發。
真的很危險,有人因此進了局子;也有公司因此損失上億。
想象一下你在一個月黑風高的夜晚,大概是10點多鐘的樣子,加班歸來,打算到小賣部弄盒煙抽。
夜涼風急,你用力裹了下被風鼓起的外套。
那里有你暗戀的收銀姑娘。
沒日沒夜的工作,只有這十幾分鐘,能讓你感到些許生活的意義。
從羞澀的錢包里翻出僅存的一張百元大鈔,結賬。然后用顫抖的雙手接過收銀員的找零。
不是因為輕觸到了她的指尖。
也并非因她如花的笑靨。
只因為,腦海里竟然不爭氣的浮現出這樣的過程。
balance = dao.getBalance(userid) balance = balance - cost dao.setBalance(userid,balance)
還真是狗改不了吃屎啊,果然還是一個碼畜。提醒著自己,自卑的埋下了臉,快步走開。
這是什么?這是我們送給996公司的一點福報。
一波麻6的操作余額修改,是交易系統里最常見的操作。上面的偽代碼,大意是先取出余額,然后扣掉消費,然后再回寫余額。通常情況下這不會發生問題。
除非是高并發,與你是否單機無關。
對單一余額的高并發操作自然不是正常人發起的,系統正在承受攻擊,或者自以為是的使用了MQ。在攻擊面前,上面的操作顯得不堪一擊。
拿一個最嚴重的例子說明:同時發起了一筆消費20元和消費5元的請求。在經過一波猛如虎的操作之后,兩個請求都支付成功了,但只扣除了5元。相當于花了5塊錢,買了25的東西。
劃重點:把以上操作擴展到提現操作上,就更加的恐怖。比如你發起了一筆100元的提現和0.01元的提現,結果余額被扣減0.01元的提現給覆蓋了。這相當于你有了一個提款機,非要薅到平臺倒閉為止。
update user set balance = balance - 20 where userid=id
這條語句就保險了很多,如果考慮到余額不能為負的情況,可以把sql更加精進一點。
update user set balance = balance - 20 where userid=id and balance >= 20
以上sql,就可以保證余額的安全,高并發下的攻擊就變得意義不大了。?但會有別的問題,比如重復扣款。
通過鎖解決現實中,這種直接通過sql扣減的應用,規模都比較小。當你的業務逐漸復雜,又沒有進行很好的拆分的情況下,先讀再設值的情況還是比較普遍的。比如某些營銷操作、打折、積分兌換等。
這種情況,可以引入分布式鎖。簡單點的,只需要使用redis的setnx或者zk來控制就可以;復雜點的方案,可以使用二階段提交之類的。
分布式事務的業務粒度,要足夠粗,才能保護這些余額操作;加鎖的粒度,要足夠細,才能保證系統的效率。
begin transition(userid) balance = dao.getBalance(userid) balance = balance - cost dao.setBalance(userid,balance) end類CAS方式解決
java的朋友可以回想下concurrent包的解決方式。那就是引入了CAS,全稱Compare And Set。
擴展到分布式環境下,同樣可以采用這一策略。即先比較再設值。如果初始值已經變化了,那么不允許set設值。
cas一般通過循環重試的方法進行狀態更新,但余額操作一般都是比較單一的,你也可以直接終止操作,并預警風險。
sql類似于:
update user set balance = balance - 20 where userid=id and balance >= 20 and balance = $old_balance
當然,你也可以通過加入版本號概念,而不是余額字段來控制這個過程,但都類似。
變種:版本號通過在表中加一個額外的字段version,來控制并發。這種方式不去關注余額,可擴展性更強。
version的默認值一般是1,即記錄創建時的默認值。
操作的偽代碼如下:
version,balance = dao.getBalance(userid) balance = balance - cost dao.exec(" update user set balance = balance - 20 version = version + 1 where userid=id and balance >= 20 and version = $old_version ")
上面的并發攻擊,將會只有一個操作能夠成功,我們的余額安全了。
End趕緊看一下你的余額操作,是否也暴露在風險之下。你可以選擇接受福報繼續當兄弟,當然也可以將福報還給資本家。
一念成佛,一念成魔。你才是自己的主人。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74112.html
摘要:在前幾天的阿里內部交流活動上,我們的馬總也與其員工討論了話題,包括自己創辦阿里的成長過程。馬總的一番話點醒了一批互聯網行業的我們。馬總說馬云提到,能做是一種巨大的福氣,很多公司很多人想都沒有機會。 最近的一個996話題在互聯網業界,可以說是非常的火熱。身為互聯網人,也在時時關注的,畢竟和我們的生活息息相關。在前幾天的阿里內部交流活動上,我們的馬總也與其員工討論了996話題,包括自己創辦...
摘要:更進一步,馬云的好朋友兼董事的楊致遠被資本聯合踢出董事會,這也意味著馬云逐漸喪失對阿里巴巴的控制權,甚至面臨出局的危險。阿里的招聘阿里的招聘在初中級崗位中的要求如下阿里軟件測試工程師招聘需求需要我們注意的是崗位需求中對技術的要求會更加嚴格。 ...
摘要:因為網站建設一般項目比較小,我一個人是可以完成前后端開發的,如果做成成品當然得加上小蘇設計師。關鍵詞選擇因為面向的是單個城市業務,在城市選擇上猶豫了不少時間,首先得是一個大城市,客戶量足,當時我在北京,小蘇是在一個省會城市。 我技術之外的資本是零,如果你也是這樣,那這篇文章適合你! 這是我的故事之一,希望對你有啟發。如果你每天下班后就是躺在床上刷刷斗音,看看微博。但是又總想擺脫黑暗迷亂...
摘要:因為網站建設一般項目比較小,我一個人是可以完成前后端開發的,如果做成成品當然得加上小蘇設計師。關鍵詞選擇因為面向的是單個城市業務,在城市選擇上猶豫了不少時間,首先得是一個大城市,客戶量足,當時我在北京,小蘇是在一個省會城市。 我技術之外的資本是零,如果你也是這樣,那這篇文章適合你! 這是我的故事之一,希望對你有啟發。如果你每天下班后就是躺在床上刷刷斗音,看看微博。但是又總想擺脫黑暗迷亂...
摘要:因為網站建設一般項目比較小,我一個人是可以完成前后端開發的,如果做成成品當然得加上小蘇設計師。關鍵詞選擇因為面向的是單個城市業務,在城市選擇上猶豫了不少時間,首先得是一個大城市,客戶量足,當時我在北京,小蘇是在一個省會城市。 我技術之外的資本是零,如果你也是這樣,那這篇文章適合你! 這是我的故事之一,希望對你有啟發。如果你每天下班后就是躺在床上刷刷斗音,看看微博。但是又總想擺脫黑暗迷亂...
閱讀 1074·2021-11-24 09:39
閱讀 1307·2021-11-18 13:18
閱讀 2425·2021-11-15 11:38
閱讀 1824·2021-09-26 09:47
閱讀 1625·2021-09-22 15:09
閱讀 1624·2021-09-03 10:29
閱讀 1510·2019-08-29 17:28
閱讀 2951·2019-08-29 16:30