成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

在 MongoDB 上模擬事務(wù)操作來實(shí)現(xiàn)支付

crossoverJie / 1446人閱讀

摘要:因?yàn)樵谥Ц哆^程中不能保證每一次操作都成功,所以還要引入一個(gè)日志表來做數(shù)據(jù)的一致性,保證用戶資金變動(dòng)與實(shí)際相符。雖然在數(shù)據(jù)設(shè)計(jì)中遇到一些復(fù)雜結(jié)構(gòu)的問題,比如和的問題。

[ 玩轉(zhuǎn) LeanCloud ] 開發(fā)者經(jīng)驗(yàn)分享:

作者:Davy

我們的產(chǎn)品叫「學(xué)海密探」,屬于在線教育行業(yè),產(chǎn)品需要有支付功能,然而支付最蛋疼是什么?有人會(huì)說是支付寶和微信等支付接口的接入開發(fā)!沒錯(cuò),但支付接口的開發(fā)算是比較簡單的了,我覺得凡是跟錢有關(guān)系的操作最重要的是事務(wù)問題,這一點(diǎn)很重要,很重要,真的很重要!LeanCloud 官方文檔中有提到 MongoDB 不支持事務(wù),并建議對事務(wù)有強(qiáng)烈需求的開發(fā)者使用其他折中方式來實(shí)現(xiàn)。我們的支付必須用事務(wù),我們經(jīng)過 N 輪討后論設(shè)計(jì)了一套基于 LeanCloud 的支付場景的通用解決方案,也許其他團(tuán)隊(duì)比我們做得好,在這里還是分享下我們的一些見解吧。

我們在用戶表 _User 中加入了一個(gè) paylogs 字段,類型是 Array,主要用于存放著每一次支付日志的 id,用它來判斷用戶的賬戶 account 的值,比如錢扣沒扣,加沒加等情況。因?yàn)樵谥Ц哆^程中不能保證每一次操作都成功,所以還要引入一個(gè)日志表 log 來做數(shù)據(jù)的一致性,保證用戶資金變動(dòng)與實(shí)際相符。log 表里有一個(gè)「狀態(tài)」字段 state,它的取值為 0 ~ 5,主要是從發(fā)起支付開始,生成 order 表,生成 log 表等,并記錄 log 的狀態(tài),后續(xù)所有的業(yè)務(wù)都要根據(jù) state 的狀態(tài)執(zhí)行不同的業(yè)務(wù)操作,不管在哪個(gè)狀態(tài)出問題都可以根據(jù) log表的 state 狀態(tài)重復(fù)執(zhí)行相應(yīng)的業(yè)務(wù)操作,從而保證支付過程的數(shù)據(jù)一致性!

比如在充值的時(shí)候,用戶扣費(fèi)成功后,修改用戶的 account 值成功了,但在修改 state 字段時(shí)失敗了,下一次再執(zhí)行時(shí)又怎么判斷用戶的 account 值已經(jīng)改變了呢?這個(gè)問題真是太重要了,這就要用到那個(gè) paylogs 字段,判斷 paylogs 字段是否有值,有值說明剛才用戶的 account 值已經(jīng)操作過了,此時(shí)可以不用操作,如果沒有再進(jìn)行操作。這里利用了 LeanCloud 數(shù)據(jù)存儲(chǔ)接口的按條件更新數(shù)據(jù)的功能(使用 query 參數(shù))來保證操作的原子性,從而也解決了并發(fā)問題!這個(gè) query 參數(shù)真得要夸一下,在 LeanCloud 還沒提供這個(gè)功能之前,我們只能采用 log 表中的新舊值比對來解決數(shù)據(jù)一致問題,但無法避免并發(fā)問題,這樣當(dāng)用戶數(shù)據(jù)錯(cuò)了,我們只能認(rèn)為支付失敗,然后進(jìn)入人工干預(yù)環(huán)節(jié),很是麻煩。

最后再說說我們和 LeanCloud 的相遇。最初是通過朋友圈知道了 LeanCloud,后來就一直關(guān)注著。也試過一些項(xiàng)目,發(fā)現(xiàn)開發(fā)應(yīng)用真是方便許多。原本大量的后端需求都要自己研發(fā),現(xiàn)在都省了,只需要專注于寫應(yīng)用端的代碼,效率自然會(huì)提高一倍以上,開發(fā)迭代速度也上去了。當(dāng)然也有過顧慮,生怕遇到一些特殊場景 LeanCloud 滿足不了那我們就悲劇了!但后來看到一些知名的應(yīng)用都在用 LeanCloud,心里也就安穩(wěn)了,有前輩們踩過坑,有 LeanCloud 的技術(shù)支持做后盾,我們就這樣選定了 LeanCloud。

隨著項(xiàng)目的進(jìn)行,我們從傳統(tǒng)的后端服務(wù)接口開發(fā)變成了面向「Document」開發(fā),服務(wù)端工作減輕了不少。雖然在數(shù)據(jù)設(shè)計(jì)中遇到一些復(fù)雜結(jié)構(gòu)的問題,比如 Pointer 和 Relations 的問題。記得當(dāng)時(shí) Array 不支持 Pointer 的 include,所以考慮用 Relations,但在 LeanCloud 社區(qū)中又看到幾個(gè)相關(guān)問題都推薦使用 Array 或者 Pointer,后來通讀了相關(guān)文檔對數(shù)據(jù)模型有了更深的理解,問題也就少了,所以說全面了解文檔是至關(guān)重要的。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19168.html

相關(guān)文章

  • database

    摘要:它是第一個(gè)把數(shù)據(jù)分布在全球范圍內(nèi)的系統(tǒng),并且支持外部一致性的分布式事務(wù)。目的是使得開發(fā)者閱讀之后,能對項(xiàng)目有一個(gè)初步了解,更好的參與進(jìn)入的開發(fā)中。深度探索數(shù)據(jù)庫并發(fā)控制技術(shù)并發(fā)控制技術(shù)是數(shù)據(jù)庫事務(wù)處理的核心技術(shù)。 存儲(chǔ)過程高級(jí)篇 講解了一些存儲(chǔ)過程的高級(jí)特性,包括 cursor、schema、控制語句、事務(wù)等。 數(shù)據(jù)庫索引與事務(wù)管理 本篇文章為對數(shù)據(jù)庫知識(shí)的查缺補(bǔ)漏,從索引,事務(wù)管理,...

    csRyan 評論0 收藏0
  • java高并發(fā)系列 - 第21天:java中的CAS操作,java并發(fā)的基石

    摘要:方法由兩個(gè)參數(shù),表示期望的值,表示要給設(shè)置的新值。操作包含三個(gè)操作數(shù)內(nèi)存位置預(yù)期原值和新值。如果處的值尚未同時(shí)更改,則操作成功。中就使用了這樣的操作。上面操作還有一點(diǎn)是將事務(wù)范圍縮小了,也提升了系統(tǒng)并發(fā)處理的性能。 這是java高并發(fā)系列第21篇文章。 本文主要內(nèi)容 從網(wǎng)站計(jì)數(shù)器實(shí)現(xiàn)中一步步引出CAS操作 介紹java中的CAS及CAS可能存在的問題 悲觀鎖和樂觀鎖的一些介紹及數(shù)據(jù)庫...

    zorro 評論0 收藏0
  • 聊聊分布式事務(wù)

    摘要:分布式事務(wù)技術(shù)理論定理。接下來我們看看分布式事務(wù)有哪幾種實(shí)現(xiàn)方案。基于協(xié)調(diào)者與參與者的思想設(shè)定,分別提出了與實(shí)現(xiàn)分布式事務(wù)。 這次使用分布式事務(wù)框架過程中了學(xué)習(xí)了一些分布式事務(wù)知識(shí),所以本文我們就來聊聊分布式事務(wù)那些事。首先我們先回顧下什么是事務(wù)。 事務(wù) 什么是事務(wù)?這個(gè)作為后端開發(fā),日常開發(fā)中只要與數(shù)據(jù)庫有交互,肯定就會(huì)使用過事務(wù)。現(xiàn)在摘抄一段wiki的解釋,解釋下什么是事務(wù)。 是數(shù)...

    wemallshop 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<