[0100]圖2為本申請另一示例性實(shí)施例示出的一種基于數(shù)據(jù)庫的數(shù)據(jù)控制方法的流程示意圖。如圖2所示,在一種可能的實(shí)施方式中,所述方法可以包括:
[0101]在步驟S201中,將數(shù)據(jù)總值分為多個子值,將子值分別存放于水平拆分的子值數(shù)據(jù)塊中;
[0102]在步驟S202中,在所述子值數(shù)據(jù)塊中選取其中之一作為合并子值數(shù)據(jù)塊;
[0103]其中,根據(jù)數(shù)據(jù)總值平均分配子值,選擇的子值的個數(shù)可以實(shí)現(xiàn)平均分配,且使每個子值都大于最大扣減額的若干倍數(shù)。并在所述子值數(shù)據(jù)塊中隨機(jī)選取其中之一作為合并子值數(shù)據(jù)塊。
[0104]在步驟S203中,當(dāng)進(jìn)行扣減時,查詢子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的快照,在合并子值數(shù)據(jù)塊和有效的子值數(shù)據(jù)塊中隨機(jī)選取其中之一;
[0105]其中,所述快照為常規(guī)的數(shù)據(jù)庫快照技術(shù)生成的子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊快照,所述有效為子值數(shù)據(jù)塊的狀態(tài)為有效(Enabled)狀態(tài)。與常規(guī)的數(shù)據(jù)庫中數(shù)據(jù)塊的設(shè)置情況相同,子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊默認(rèn)為有效狀態(tài)。本實(shí)施例是以一次扣減為例說明數(shù)據(jù)控制的流程,在實(shí)際地并發(fā)過程中,當(dāng)子值數(shù)據(jù)塊都已無效,即子值數(shù)據(jù)塊都已扣減盡時(所有合并操作結(jié)束),只有合并子值數(shù)據(jù)塊可以選擇,當(dāng)合并子值數(shù)據(jù)塊中的余值小于最大扣減額時,不能再進(jìn)行最大扣減額的扣減,當(dāng)合并子值數(shù)據(jù)塊中的余值小于最小扣減額時,所有扣減結(jié)束,此時總余值達(dá)到最小。
[0106]在步驟S204中,判斷被選取的是否為子值數(shù)據(jù)塊,若被選取的非子值數(shù)據(jù)塊,則選取的為合并子值數(shù)據(jù)塊;
[0107]在步驟S205中,當(dāng)選取的是合并子值數(shù)據(jù)塊時,對被選取的合并子值數(shù)據(jù)塊進(jìn)行扣減,并插入扣減流水,一次扣減結(jié)束。
[0108]在步驟S206中,當(dāng)被選取的為子值數(shù)據(jù)塊時,在被選取的子值數(shù)據(jù)塊所在的數(shù)據(jù)庫上,鎖定被選取的子值數(shù)據(jù)塊的余值記錄;
[0109]其中,由于在活動中,是并發(fā)地發(fā)起扣減,數(shù)據(jù)庫進(jìn)行并發(fā)操作,若對并發(fā)操作不加控制可能會發(fā)生讀取和存儲不正確數(shù)據(jù)的情況,破壞數(shù)據(jù)庫的一致性。因此當(dāng)一個事務(wù)在對某個子值數(shù)據(jù)塊進(jìn)行操作前,先對其加鎖,在該事務(wù)釋放鎖之前,其他的事務(wù)不能更新該子值數(shù)據(jù)塊,從而可以保證子值數(shù)據(jù)塊的完整性和一致性,通常該事務(wù)提交后,鎖便被釋放。由于合并子值數(shù)據(jù)塊還需要參與進(jìn)行合并余值碎片操作,所以不鎖定。
[0110]在步驟S207中,對被選取的子值數(shù)據(jù)塊進(jìn)行扣減,并插入扣減流水,一次扣減結(jié)束;
[0111]其中,對被選取的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊,將其余值減去扣減額,同時插入扣減流水,所述扣減流水用于在數(shù)據(jù)庫出現(xiàn)操作錯誤(例如扣減失敗)而回滾時作為參考,以保證回滾后數(shù)據(jù)的一致性和完整性,所述回滾為常規(guī)的回滾操作。本申請實(shí)施例中的流水操作皆為常規(guī)的流水操作。插入扣減流水成功后,扣減完成。
[0112]在步驟S208中,當(dāng)選取子值數(shù)據(jù)塊進(jìn)行扣減時,判斷扣減后被選取的子值數(shù)據(jù)塊的余值是否小于閾值;
[0113]其中,所述閾值選取大于最大扣減額且小于兩倍最大扣減額的值。
[0114]在步驟S209中,當(dāng)扣減后被選取的子值數(shù)據(jù)塊的余值大于或等于閾值時,釋放對被選取的所述子值數(shù)據(jù)塊的鎖定,并返回步驟S203,否則,繼續(xù)保持鎖定;
[0115]當(dāng)子值數(shù)據(jù)塊的余值大于或等于閾值時,不進(jìn)行合并,返回步驟203,等待進(jìn)行下一次扣減。
[0116]在步驟S210中,當(dāng)被選取的子值數(shù)據(jù)塊的余值小于閾值時,插入合并流水,合并流水的合并額等于被選取的子值數(shù)據(jù)塊的余值;
[0117]其中,可以在插入合并流水時設(shè)置合并流水的狀態(tài)為初始(Initial)狀態(tài),或者設(shè)置合并流水的狀態(tài)為未完成狀態(tài)。
[0118]在步驟S211中,將被選取的子值數(shù)據(jù)塊的余值設(shè)置為零,并將被選取的子值數(shù)據(jù)塊的狀態(tài)設(shè)置為失效;
[0119]被選取的子值數(shù)據(jù)塊失效后,其鎖定也失效。由于插入合并流水后,需要合并到合并子值數(shù)據(jù)塊的余值已記錄在合并流水中,并在后續(xù)的步驟中合并至合并子值數(shù)據(jù)塊,因此此時子值數(shù)據(jù)塊的余值已為多余,可以在插入合并流水后將子值數(shù)據(jù)快的余值設(shè)置為零,還可以進(jìn)一步將子值數(shù)據(jù)塊的狀態(tài)設(shè)置為失效。
[0120]在步驟S212中,發(fā)起異步合并流程,完成合并。其中,所述異步合并流程包括:
[0121]在步驟S213中,讀取所述合并流水;
[0122]在步驟S214中,在合并子值數(shù)據(jù)塊所在的數(shù)據(jù)庫中,增加合并子值數(shù)據(jù)塊的余值,增加的額度等于合并流水的合并額;
[0123]在步驟S215中,插入增加流水,增加流水以所述合并流水的主鍵值為唯一性約束;
[0124]其中,所述增加流水以所述合并流水的主鍵值為唯一性約束,使增加流水和合并流水一一對應(yīng),從而使合并源(進(jìn)行合并的被選取的子值數(shù)據(jù)塊)和目標(biāo)(合并子值數(shù)據(jù)塊)對應(yīng)。當(dāng)合并失敗時,合并流水沒有對應(yīng)的增加流水,從而可以根據(jù)合并流水是否有對應(yīng)的增加流水判斷合并是否失敗。同時,插入和合并流水對應(yīng)的增加流水,有利于保證數(shù)據(jù)庫的冪等性,防止一次扣減發(fā)生后,對被選取進(jìn)行扣減的子值數(shù)據(jù)塊進(jìn)行的合并操作和對應(yīng)的增加操作被重復(fù)執(zhí)行。
[0125]在步驟S216中,將所述合并流水狀態(tài)設(shè)置為完成狀態(tài),例如,將合并流水的狀態(tài)設(shè)置為SUCCESS (成功),一次合并結(jié)束。
[0126]當(dāng)插入增加流水后,將所述合并流水狀態(tài)設(shè)置為完成狀態(tài)。
[0127]在一種可能的實(shí)施方式中,本申請實(shí)施例提供的基于數(shù)據(jù)庫的數(shù)據(jù)控制方法,還可以包括:
[0128]建立合并補(bǔ)償后臺定時任務(wù),所述合并補(bǔ)償后臺定時任務(wù)周期性掃描合并流水和增加流水,當(dāng)存在合并流水對應(yīng)的增加流水為空時,對所述合并流水重新執(zhí)行異步合并流程。
[0129]其中,所述合并補(bǔ)償后臺定時任務(wù)的建立可以采用常規(guī)的后臺定時任務(wù)的建立方法。
[0130]在一種可能的實(shí)施方式中,本申請實(shí)施例提供的基于數(shù)據(jù)庫的數(shù)據(jù)控制方法,還可以包括:快照更新流程。
[0131]所述快照更新流程,在一種可能的實(shí)施方式中,可以包括:
[0132](al)當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的余值發(fā)生變化時,將所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的版本號加1 ;
[0133](a2)當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的快照的版本號小于對應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號時,更新所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的快照。
[0134]其中,對子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的快照更新可以采用常規(guī)的數(shù)據(jù)庫快照更新技術(shù)。當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的余值沒有發(fā)生變化時,不修改版本號。當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的快照的版本號大于或等于對應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號時,不更新快照。
[0135]由于在活動是并發(fā)的發(fā)起扣減,同一個子值數(shù)據(jù)塊會被并發(fā)地更新,同時為避免產(chǎn)生熱點(diǎn)問題,快照和對應(yīng)的數(shù)據(jù)通常位于不同的數(shù)據(jù)庫,在本申請的實(shí)施例中快照與子值數(shù)據(jù)塊及合并子值數(shù)據(jù)塊位于不同的數(shù)據(jù)庫,因此對快照的更新順序無法保證與對應(yīng)的子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的更新順序一致,為克服這個問題,引入版本號,通過比對快照的版本號和快照對應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號,當(dāng)快照的版本號低于快照對應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號時,證明子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊已發(fā)生更新,由此更新對應(yīng)的快照,從而保證快照的更新順序與對應(yīng)的子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的更新順序一致。
[0136]如果每一次子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊發(fā)生扣減(即余值發(fā)生變化)都進(jìn)行快照更新,那么快照所在的數(shù)據(jù)庫也會產(chǎn)生熱點(diǎn)問題。由于所有的扣減操作,都是在余值大于閾值或者余值大于或等于時才能進(jìn)行,因此對快照無需標(biāo)示具體的余值數(shù)值,只需標(biāo)示是否“大于閾值(> 閾值)”或者“大于等于閾值閾值)”,或者標(biāo)示為“可扣減”,即可。另夕卜,由于子值數(shù)據(jù)塊的余值小于閾值或者小于或等于閾值時,意味著該子值數(shù)據(jù)塊的余值會被合并且被設(shè)置為零,所以快照標(biāo)示為“小于等于閾值(彡閾值)”或者“小于閾值( <閾值)”,或者標(biāo)識為“不可扣減”的子值數(shù)據(jù)塊實(shí)際都是余值為零的。因此快照只標(biāo)示與閾值之間的大小關(guān)系即可。當(dāng)查詢到快照標(biāo)示為“> 閾值”或者閾值”時,可以對對應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊進(jìn)行扣減,當(dāng)查詢到快照標(biāo)示為閾值”或者“<閾值”時,不能進(jìn)行扣減;或者當(dāng)查詢到快照標(biāo)示“可扣減”,可以對對應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊進(jìn)行扣減,當(dāng)查詢到快照“不可扣減”時,不能進(jìn)行扣減。也可以標(biāo)示其他的字符串或者數(shù)值等,來表征快照對應(yīng)的子值數(shù)據(jù)塊或者合并子值數(shù)據(jù)塊是否可以進(jìn)行扣減,例如,快照標(biāo)示為1,表示可扣減,快照標(biāo)示為0,表示不可扣減。由此可見,對于上述的快照,只需要在合并發(fā)生時進(jìn)行快照更新,便可以保證流程的正確運(yùn)行,并且可以避免快照所在的數(shù)據(jù)庫成為新的熱點(diǎn),簡化快照更新過程,提高處理效率?;诖耍隹煺崭铝鞒?,在另一種可能的實(shí)施方式中,可以包括:
[0137](bl)當(dāng)子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的余值大于或等于閾值或者大于閾值時,子值數(shù)據(jù)塊對應(yīng)的快照和合并子值數(shù)據(jù)塊對應(yīng)的快照標(biāo)示為“大于等于閾值”或者“大于閾值”,否則子值數(shù)據(jù)塊對應(yīng)的快照和合并子值數(shù)據(jù)塊對應(yīng)的快照標(biāo)示為“小于閾值”或者“小于等于閾值”;
[0138](b2)當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的余值發(fā)生變化時,將所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的版本號加1 ;
[0139](b3)判斷是否有合并發(fā)生;
[0140](b4)當(dāng)有合并發(fā)生時,判斷子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的快照的版本號是否小于對應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號;
[0141](b5)當(dāng)步驟(b4)中判斷的結(jié)果為子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的快照的版本號小于對應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號時,更新所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的快照。
[0142]判斷是否有合并發(fā)生可以通過判斷是否插入了新的合并流水進(jìn)行。
[0143]對于只在合并時更新快照的情況,所述快照更新流程,在又一種可能的是實(shí)施方式中,可以包括:
[0144](cl)當(dāng)子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的余值大于或等于閾值時,子值數(shù)據(jù)塊對應(yīng)的快照和合并子值數(shù)據(jù)塊對應(yīng)的快照標(biāo)示為“可扣減”,否則子值數(shù)據(jù)塊對應(yīng)的快照和合并子值數(shù)據(jù)塊對應(yīng)的快照標(biāo)示為“不可扣減”;
[0145](c2)當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的余值發(fā)生變化時,將所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的版本號加1 ;
[0146](c3)當(dāng)有合并發(fā)生,使能對子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊進(jìn)行快照更新的功能,并判斷子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的快照的版本號是否小于對應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號,否則,禁止對子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊進(jìn)行快照更新的功能;
[0147](c4)當(dāng)步驟(c3)中判斷的結(jié)果為子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的快照的版本號小于對應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號時,更新所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的快照。
[0148]當(dāng)有合并發(fā)生時,使能對子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊進(jìn)行快照更新的功能,在可以更新子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的快照,當(dāng)沒有合并發(fā)生時,則禁止對子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊進(jìn)行快照更新的功能,不能更新子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的快照。
[0149]下面用本申請的一個應(yīng)用案例進(jìn)一步說明本申請,以使本領(lǐng)域技術(shù)人員更好地理解本申請的原理和應(yīng)用。為使描