一種基于數(shù)據(jù)庫的數(shù)據(jù)控制方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)庫技術(shù)領(lǐng)域,尤其涉及一種基于數(shù)據(jù)庫的數(shù)據(jù)控制方法及系統(tǒng)。
【背景技術(shù)】
[0002]數(shù)據(jù)庫處理中,常會(huì)存在對(duì)一個(gè)總值,例如物品總數(shù)量、空間總量或資金總額等,短時(shí)間內(nèi)進(jìn)行大量次數(shù)的扣減計(jì)算的情況,例如短時(shí)間內(nèi)大量用戶申請(qǐng)存儲(chǔ)空間,需要對(duì)空間總量跟隨用戶的申請(qǐng)情況不斷扣減計(jì)算,并記錄扣減情況,直至可申請(qǐng)的空間用盡。這種情況下的數(shù)據(jù)控制,實(shí)現(xiàn)方式一般分為兩種:
[0003]1.集中控制:以一條數(shù)據(jù)庫記錄存放數(shù)據(jù)總值,每次對(duì)數(shù)據(jù)總值的扣減和余值判斷等操作通過數(shù)據(jù)庫的SQL語句在一個(gè)數(shù)據(jù)庫事務(wù)中進(jìn)行;
[0004]2.分散控制:將數(shù)據(jù)總值拆分到不同的數(shù)據(jù)庫,將每次扣減操作均衡到不同數(shù)據(jù)庫的數(shù)據(jù)塊上。例如:空間總量為1000G,用戶每次可以申請(qǐng)3G的空間,數(shù)值3為扣減額,實(shí)現(xiàn)時(shí),將數(shù)據(jù)總值1000由分布在10個(gè)子值數(shù)據(jù)塊的10條記錄存放,每條記錄存放100,發(fā)生一次扣減3的操作時(shí),將該操作路由到10個(gè)子值數(shù)據(jù)塊的其中一個(gè)上,例如在第二個(gè)子值數(shù)據(jù)塊上扣減,其余值變?yōu)?7,剩余的子值數(shù)據(jù)塊的記錄仍為100。
[0005]發(fā)明人在實(shí)現(xiàn)本申請(qǐng)的過程中發(fā)現(xiàn),上述第1種集中控制方式由于對(duì)數(shù)據(jù)進(jìn)行集中存儲(chǔ)和操作,會(huì)帶來數(shù)據(jù)庫熱點(diǎn)問題,所謂熱點(diǎn)問題為短時(shí)間內(nèi)對(duì)少量數(shù)據(jù)塊進(jìn)行過于頻繁的訪問,導(dǎo)致系統(tǒng)等待時(shí)間增加,處理效率降低,同時(shí)集中控制使用數(shù)據(jù)庫的單條記錄存放余值,由于操作訪問量高,使得該條記錄的更新存在性能瓶頸,容易出現(xiàn)更新錯(cuò)誤;上述第2種分散控制方式雖然將數(shù)據(jù)分散在多個(gè)數(shù)據(jù)塊上,有利于解決熱點(diǎn)問題,但是對(duì)不同數(shù)據(jù)塊的操作彼此獨(dú)立,容易產(chǎn)生大量余值碎片。例如,上述第2種方式的示例中,當(dāng)扣減至每個(gè)數(shù)據(jù)塊的子值余值為1時(shí),即便總余值(余值的總和)為10,也無法再進(jìn)行扣減的操作,此時(shí)不能進(jìn)行扣減的數(shù)據(jù)塊的余值成為余值碎片。尤其當(dāng)扣減額為多個(gè)值時(shí),例如,用戶每次可以選擇申請(qǐng)3G、5G或15G的空間,則由于扣減額每次都不確定,無法保證每個(gè)子值數(shù)據(jù)塊中的子值都可以扣減盡,通常這種情況都會(huì)產(chǎn)生大量的余值碎片,使多個(gè)數(shù)據(jù)塊中的余值無法使用,不能使總余值達(dá)到最小,且造成資源和數(shù)據(jù)庫空間的浪費(fèi)。
【發(fā)明內(nèi)容】
[0006]為克服相關(guān)技術(shù)中數(shù)據(jù)控制不能同時(shí)解決熱點(diǎn)問題和總余值最小化問題的缺陷,本申請(qǐng)?zhí)峁┮环N基于數(shù)據(jù)庫的數(shù)據(jù)控制方法及系統(tǒng)。
[0007]根據(jù)本申請(qǐng)實(shí)施例的第一方面,提供一種基于數(shù)據(jù)庫的數(shù)據(jù)控制方法,包括:
[0008]將數(shù)據(jù)總值分為多個(gè)子值,將子值分別存放于水平拆分的子值數(shù)據(jù)塊中;
[0009]當(dāng)子值數(shù)據(jù)塊的余值小于或等于閾值時(shí),合并余值碎片,所述余值碎片為所述子值數(shù)據(jù)塊的余值,所述合并余值碎片包括:將所述子值數(shù)據(jù)塊的余值合并至合并子值數(shù)據(jù)塊中,且設(shè)置所述子值數(shù)據(jù)塊的余值為零;
[0010]當(dāng)進(jìn)行扣減時(shí),合并子值數(shù)據(jù)塊參與扣減。
[0011]其中,所述閾值大于或等于最大扣減額且小于數(shù)據(jù)總值。
[0012]其中,當(dāng)進(jìn)行扣減時(shí),在余值大于或等于閾值的子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊中選取其中之一進(jìn)行扣減。
[0013]可選的,所述的基于數(shù)據(jù)庫的數(shù)據(jù)控制方法,當(dāng)子值數(shù)據(jù)塊的余值為零時(shí),設(shè)置所述子值數(shù)據(jù)塊的狀態(tài)為失效。
[0014]可選的,當(dāng)進(jìn)行扣減時(shí),在余值大于或等于閾值的子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊中選取其中之一進(jìn)行扣減,包括:
[0015]當(dāng)進(jìn)行扣減時(shí),查詢子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的快照,在合并子值數(shù)據(jù)塊和有效的子值數(shù)據(jù)塊中隨機(jī)選取其中之一;
[0016]當(dāng)選取的為子值數(shù)據(jù)塊時(shí),在被選取的子值數(shù)據(jù)塊所在的數(shù)據(jù)庫上,鎖定被選取的子值數(shù)據(jù)塊的余值記錄;
[0017]對(duì)被選取的子值數(shù)據(jù)塊或者合并子值數(shù)據(jù)塊進(jìn)行扣減,并插入扣減流水。
[0018]可選的,所述當(dāng)子值數(shù)據(jù)塊的余值小于或等于閾值時(shí),合并余值碎片,包括:
[0019]插入合并流水,合并流水的合并額等于所述子值數(shù)據(jù)塊的余值;
[0020]將所述子值數(shù)據(jù)塊的余值設(shè)置為零;
[0021]發(fā)起異步合并流程,所述異步合并流程包括:
[0022]讀取所述合并流水;
[0023]在合并子值數(shù)據(jù)塊所在的數(shù)據(jù)庫中,增加合并子值數(shù)據(jù)塊的余值,增加的額度等于合并流水的合并額;
[0024]將所述合并流水狀態(tài)設(shè)置為完成狀態(tài)。
[0025]可選的,所述異步合并流程,在增加合并子值數(shù)據(jù)塊的余值后,還包括:
[0026]插入增加流水,增加流水以所述合并流水的主鍵值為唯一性約束。
[0027]可選的,所述的基于數(shù)據(jù)庫的數(shù)據(jù)控制方法,還包括:
[0028]建立合并補(bǔ)償后臺(tái)定時(shí)任務(wù),所述合并補(bǔ)償后臺(tái)定時(shí)任務(wù)周期性掃描合并流水和增加流水,當(dāng)存在合并流水對(duì)應(yīng)的增加流水為空時(shí),對(duì)所述合并流水重新執(zhí)行異步合并流程。
[0029]所述的基于數(shù)據(jù)庫的數(shù)據(jù)控制方法,還包括:快照更新流程,所述快照更新流程包括:
[0030]當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的余值發(fā)生變化時(shí),將所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的版本號(hào)加1;
[0031]當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的快照的版本號(hào)小于對(duì)應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號(hào)時(shí),更新所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的快照。
[0032]可選的,所述快照更新流程,包括:
[0033]當(dāng)子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的余值大于或等于閾值時(shí),將子值數(shù)據(jù)塊對(duì)應(yīng)的快照和合并子值數(shù)據(jù)塊對(duì)應(yīng)的快照標(biāo)示為“可扣減”,否則將子值數(shù)據(jù)塊對(duì)應(yīng)的快照和合并子值數(shù)據(jù)塊對(duì)應(yīng)的快照標(biāo)示為“不可扣減”;
[0034]當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的余值發(fā)生變化時(shí),將所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的版本號(hào)加1 ;
[0035]當(dāng)合并發(fā)生時(shí),且當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的快照的版本號(hào)小于對(duì)應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號(hào)時(shí),更新所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的快照。
[0036]根據(jù)本申請(qǐng)實(shí)施例的第二方面,提供一種基于數(shù)據(jù)庫的數(shù)據(jù)控制系統(tǒng),包括:
[0037]數(shù)據(jù)總值拆分單元,用于將數(shù)據(jù)總值分為多個(gè)子值,并將子值分別存放于水平拆分的子值數(shù)據(jù)塊中;
[0038]合并子值數(shù)據(jù)塊生成單元,用于生成合并子值數(shù)據(jù)塊;
[0039]余值碎片合并單元,用于當(dāng)子值數(shù)據(jù)塊小于或等于閾值時(shí),將所述子值數(shù)據(jù)塊的余值合并至合并子值數(shù)據(jù)塊中,且設(shè)置所述子值數(shù)據(jù)塊的余值為零;
[0040]扣減單元,用于當(dāng)用戶發(fā)起扣減時(shí),在余值大于或等于閾值的子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊中選取其中之一進(jìn)行扣減。
[0041]其中,所述閾值大于或等于扣減額且小于數(shù)據(jù)總值。
[0042]可選的,所述余值碎片合并單元,還包括:
[0043]數(shù)據(jù)塊狀態(tài)設(shè)置模塊,用于當(dāng)子值數(shù)據(jù)塊的余值為零時(shí),設(shè)置所述子值數(shù)據(jù)塊的狀態(tài)為失效。
[0044]可選的,所述扣減單元,包括:
[0045]快照查詢模塊,用于當(dāng)用戶發(fā)起扣減時(shí),查詢子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的快昭.
[0046]數(shù)據(jù)塊選取模塊,用于在合并子值數(shù)據(jù)塊和有效的子值數(shù)據(jù)塊中隨機(jī)選取其中之
[0047]數(shù)據(jù)塊鎖定模塊,用于當(dāng)選取的為子值數(shù)據(jù)塊時(shí),在被選取的子值數(shù)據(jù)塊所在的數(shù)據(jù)庫上,鎖定被選取的子值數(shù)據(jù)塊的余值記錄;
[0048]余值扣減模塊,用于對(duì)被選取的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊進(jìn)行扣減;
[0049]扣減流水插入模塊,在對(duì)被選取的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊進(jìn)行扣減后,插入扣減流水。
[0050]可選的,所述余值碎片合并單元,包括:
[0051]判斷模塊,用于判斷子值數(shù)據(jù)塊的余值是否小于或等于閾值;
[0052]合并流水插入模塊,用于當(dāng)子值數(shù)據(jù)塊的余值小于或等于閾值時(shí),插入合并流水,合并流水的合并額等于所述子值數(shù)據(jù)塊的余值;
[0053]置零模塊,用于將所述子值數(shù)據(jù)塊的余值設(shè)置為零;
[0054]異步合并模塊,所述異步合并模塊用于發(fā)起并執(zhí)行異步合并流程,所述異步合并模塊包括:
[0055]合并流水讀取子模塊,用于讀取所述合并流水;
[0056]余值合并子模塊,用于在合并子值數(shù)據(jù)塊所在的數(shù)據(jù)庫中,增加合并子值數(shù)據(jù)塊的余值,增加的額度等于合并流水的合并額;
[0057]合并流水狀態(tài)設(shè)置子模塊,用于將所述合并流水狀態(tài)設(shè)置為完成狀態(tài)。
[0058]可選的,所述異步合并模塊,還包括:
[0059]增加流水插入子模塊,用于在增加合并子值數(shù)據(jù)塊的余值后,插入增加流水,且增加流水以所述合并流水的主鍵值為唯一性約束。
[0060]可選的,所述的基于數(shù)據(jù)庫的數(shù)據(jù)控制系統(tǒng),還包括:
[0061]合并補(bǔ)償后臺(tái)定時(shí)任務(wù)單元,用于周期性掃描合并流水和增加流水,當(dāng)存在合并流水對(duì)應(yīng)的增加流水為空時(shí),對(duì)所述合并流水重新執(zhí)行異步合并流程。
[0062]所述的基于數(shù)據(jù)庫的數(shù)據(jù)控制系統(tǒng),還包括:快照更新單元,所述快照更新單元包括:
[0063]版本號(hào)變更模塊,用于當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的余值發(fā)生變化時(shí),將所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的版本號(hào)加1 ;
[0064]版本號(hào)判斷模塊,用于判斷子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的快照的版本號(hào)是否小于對(duì)應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號(hào);
[0065]數(shù)據(jù)塊快照更新模塊,用于當(dāng)子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的快照的版本號(hào)小于對(duì)應(yīng)的子值數(shù)據(jù)塊或合并子值數(shù)據(jù)塊的版本號(hào)時(shí),更新所述子值數(shù)據(jù)塊或所述合并子值數(shù)據(jù)塊的快照。
[0066]可選的,所述快照更新單元,還包括:
[0067]快照標(biāo)示模塊,用于當(dāng)子值數(shù)據(jù)塊和合并子值數(shù)據(jù)塊的余值大于或等于閾值時(shí),將子值數(shù)據(jù)塊對(duì)應(yīng)的快照和合并子值數(shù)據(jù)塊對(duì)應(yīng)的快照標(biāo)示為“可扣減”,否則將子值數(shù)據(jù)塊對(duì)應(yīng)的快照和合并子值數(shù)據(jù)塊對(duì)應(yīng)的快照標(biāo)示為“不可扣減”;
[0068]快照更新判斷模塊,用于判斷當(dāng)前是否發(fā)生合并;
[0069]快照更新控制模塊,用于當(dāng)發(fā)生合并時(shí),使能所述數(shù)據(jù)塊快照更新模塊,否則,禁止所述數(shù)據(jù)塊快照更新模塊。
[0070]因此本申請(qǐng)實(shí)施例提供的技術(shù)方案可以包括以下有益效果:將數(shù)據(jù)總值分為多個(gè)子值,分別存放于水平拆分的多個(gè)子值數(shù)據(jù)塊中,使子值數(shù)據(jù)塊分布于不同的數(shù)據(jù)庫,從而解決集中式數(shù)據(jù)控制存在的熱點(diǎn)問題。通過設(shè)置合并子值數(shù)據(jù)塊,當(dāng)子值數(shù)據(jù)塊的余值小于閾值或者余值小于或等于閾值時(shí),將子值數(shù)據(jù)塊中的余值合并至合并子值數(shù)據(jù)塊中,并將被合并的子值數(shù)據(jù)塊的余值設(shè)為零,其中,閾值大于或等于最大的扣減額。同時(shí)合并子值數(shù)據(jù)塊也參與扣減,因此當(dāng)扣減全部結(jié)束時(shí),所有數(shù)據(jù)塊的余值都為零,或者只有合并子值數(shù)據(jù)塊中存在余值,且所述余值最小,亦即所有數(shù)據(jù)塊的總余值達(dá)到最小,從而最大程度地減少余值碎片的產(chǎn)生,避免數(shù)據(jù)庫空間和資源的浪費(fèi)。綜上所述,本申請(qǐng)實(shí)施例提供的技術(shù)方案通過分散數(shù)據(jù)總值及引入碎片合并機(jī)制,避免了相關(guān)技術(shù)中數(shù)據(jù)控制存在的熱點(diǎn)問題,且使總余值最小,最大程度地減少余值碎片的產(chǎn)生,提高數(shù)據(jù)控制效率,避免資源、數(shù)據(jù)庫空間和數(shù)據(jù)處理資源的浪費(fèi)。
[0071]應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性和解釋性的,并不能限制本申請(qǐng)。
【附圖說明】
[0072]為了更清楚地說明