本發(fā)明屬于計(jì)算機(jī)信息技術(shù)領(lǐng)域,尤其涉及一種用主鍵唯一性實(shí)現(xiàn)事務(wù)操作的方法及裝置。
背景技術(shù):
在軟件開(kāi)發(fā)過(guò)程中,按照業(yè)務(wù)、安全的需求,經(jīng)常需要系統(tǒng)軟件實(shí)現(xiàn)業(yè)務(wù)數(shù)據(jù)一致,例如余額取款,首先需要確保賬戶里有足夠的余額,才能進(jìn)行取款操作,否則操作失敗。為了保證這種業(yè)務(wù)數(shù)據(jù)一致性,系統(tǒng)軟件通常會(huì)先查詢帳戶余額,然后再進(jìn)行業(yè)務(wù)操作。這過(guò)程需要加上事務(wù)鎖以確保在未完成操作之前,數(shù)據(jù)不會(huì)被其他業(yè)務(wù)線程修改,避免高并發(fā)下的數(shù)據(jù)沖突。即是先把賬戶余額加鎖,再進(jìn)行查詢、扣款動(dòng)作,完成操作后再解鎖,在這過(guò)程中,其他請(qǐng)求必須在解鎖后才能操作賬戶余額,這樣利用事務(wù)鎖來(lái)保證數(shù)據(jù)一致性。
這種方法對(duì)于數(shù)據(jù)量、并發(fā)量不大的軟件系統(tǒng),可以很好地解決數(shù)據(jù)一致性的問(wèn)題,但是對(duì)于數(shù)據(jù)量大、高并發(fā)的系統(tǒng),就會(huì)降低系統(tǒng)性能和穩(wěn)定性。事務(wù)加鎖、查詢都會(huì)增加系統(tǒng)性能的消耗。由于事務(wù)鎖的特性,在高并發(fā)環(huán)境下,只接受當(dāng)前的一個(gè)請(qǐng)求,其他請(qǐng)求只能在排隊(duì)等待,即使在多線程系統(tǒng)中也只能是排隊(duì)輪候。而且系統(tǒng)中大量使用事務(wù)鎖,則容易引發(fā)死鎖的異常情況,增加系統(tǒng)不穩(wěn)定因素。
在檢索到的申請(qǐng)?zhí)枮?01310650884.0的文件中,其公開(kāi)了“主備數(shù)據(jù)庫(kù)數(shù)據(jù)一致性核查備份方法及其系統(tǒng)”,其原理是利用MD5哈希每條數(shù)記錄,以哈希值作為依據(jù)對(duì)比數(shù)據(jù)是不是發(fā)生更改,以便只同步已更改的數(shù)據(jù),用于數(shù)據(jù)主從復(fù)制,也則是主要用于數(shù)據(jù)備份,并不涉及具體的系統(tǒng)業(yè)務(wù)的處理。
技術(shù)實(shí)現(xiàn)要素:
為了克服現(xiàn)有技術(shù)的不足,本發(fā)明的目的之一在于提供一種用主鍵唯一性實(shí)現(xiàn)事務(wù)操作的方法,其能通過(guò)主鍵來(lái)保證數(shù)據(jù)一致性,并且能夠增加系統(tǒng)的穩(wěn)定性。
本發(fā)明的目的之二在于提供一種用主鍵唯一性實(shí)現(xiàn)事務(wù)操作的裝置,其能通過(guò)主鍵來(lái)保證數(shù)據(jù)一致性,并且能夠增加系統(tǒng)的穩(wěn)定性。
本發(fā)明的目的之一采用以下技術(shù)方案實(shí)現(xiàn):
一種用主鍵唯一性實(shí)現(xiàn)事務(wù)操作的方法,包括以下步驟:
S1:在數(shù)據(jù)庫(kù)中創(chuàng)建一張主鍵表;
S2:提取業(yè)務(wù)操作中的業(yè)務(wù)操作數(shù)據(jù);
S3:對(duì)業(yè)務(wù)操作數(shù)據(jù)排序,并合并成業(yè)務(wù)字符組;
S4:將業(yè)務(wù)字符組插入主鍵表中,并判斷是否插入成功,如果插入成功,則執(zhí)行相對(duì)應(yīng)的業(yè)務(wù)操作,如果插入失敗,則停止業(yè)務(wù)操作。
優(yōu)選的,在步驟S3與步驟S4之間還包括以下步驟:
步驟S31:通過(guò)哈希算法對(duì)該業(yè)務(wù)字符組進(jìn)行哈希值轉(zhuǎn)換。其能進(jìn)一步降低主鍵索引容量,減少索引檢索的性能消耗。
優(yōu)選的,所述哈希算法為MD5算法。
本發(fā)明的目的之二采用以下技術(shù)方案實(shí)現(xiàn):
一種用主鍵唯一性實(shí)現(xiàn)事務(wù)操作的裝置,包括以下模塊:
主鍵表創(chuàng)建模塊:用于在數(shù)據(jù)庫(kù)中創(chuàng)建一張主鍵表;
業(yè)務(wù)數(shù)據(jù)提取模塊:用于提取業(yè)務(wù)操作中的業(yè)務(wù)操作數(shù)據(jù);
合并字符模塊:用于對(duì)業(yè)務(wù)操作數(shù)據(jù)排序,并合并成業(yè)務(wù)字符組;
插入判斷模塊:用于將業(yè)務(wù)字符組插入主鍵表中,并判斷是否插入成功,如果插入成功,則執(zhí)行相對(duì)應(yīng)的業(yè)務(wù)操作,如果插入失敗,則停止業(yè)務(wù)操作。
優(yōu)選的,在合并字符模塊和插入判斷模塊之間還包括以下模塊:
哈希值轉(zhuǎn)換模塊:用于通過(guò)哈希算法對(duì)該業(yè)務(wù)字符組進(jìn)行哈希值轉(zhuǎn)換。其能進(jìn)一步降低主鍵索引容量,減少索引檢索的性能消耗。
優(yōu)選的,所述哈希算法為MD5算法。
相比現(xiàn)有技術(shù),本發(fā)明的有益效果在于:
本發(fā)明的方法是抽取業(yè)務(wù)關(guān)鍵數(shù)據(jù)產(chǎn)生唯一主鍵,利用數(shù)據(jù)庫(kù)的主鍵唯一性的特點(diǎn),避免在高并發(fā)環(huán)境下由于數(shù)據(jù)重復(fù)更改導(dǎo)致的數(shù)據(jù)沖突,確保事務(wù)數(shù)據(jù)一致性。本方案并沒(méi)有使用事務(wù)鎖,而且并不需要進(jìn)行額外的查詢操作,因此近乎不影響系統(tǒng)性能,也不影響系統(tǒng)的穩(wěn)定性,適用于高并發(fā)、海量數(shù)據(jù)的業(yè)務(wù)場(chǎng)景。
附圖說(shuō)明
圖1為本發(fā)明一種用主鍵唯一性實(shí)現(xiàn)事務(wù)操作的方法的流程圖;
圖2為本發(fā)明一種用主鍵唯一性實(shí)現(xiàn)事務(wù)操作的裝置的結(jié)構(gòu)圖。
具體實(shí)施方式
下面,結(jié)合附圖以及具體實(shí)施方式,對(duì)本發(fā)明做進(jìn)一步描述:
如圖1所示,本發(fā)明提供了一種用主鍵唯一性實(shí)現(xiàn)事務(wù)操作的方法,包括以下步驟:
S1:在數(shù)據(jù)庫(kù)中創(chuàng)建一張主鍵表;
S2:提取業(yè)務(wù)操作中的業(yè)務(wù)操作數(shù)據(jù);
S3:對(duì)業(yè)務(wù)操作數(shù)據(jù)排序,并合并成業(yè)務(wù)字符組;在整個(gè)流程中,并不需要使用事務(wù)鎖,只需要將關(guān)鍵的業(yè)務(wù)數(shù)據(jù)組合成主鍵即可;
S31:通過(guò)哈希算法對(duì)該業(yè)務(wù)字符組進(jìn)行哈希值轉(zhuǎn)換;所述哈希算法為MD5算法;其中將關(guān)鍵業(yè)務(wù)數(shù)據(jù)hash是為了轉(zhuǎn)換成具有唯一性、長(zhǎng)度固定在16位的主鍵字符,以降低主鍵索引的容量,減少索引帶來(lái)的性能的消耗,相對(duì)于本方案,hash算法的選用主要考慮兩個(gè)因素:性能和摘要長(zhǎng)度,因此性能高且摘要字符少的MD5算法更加的適用;
S4:將業(yè)務(wù)字符組插入主鍵表中,并判斷是否插入成功,如果插入成功,則執(zhí)行相對(duì)應(yīng)的業(yè)務(wù)操作,如果插入失敗,則停止業(yè)務(wù)操作。本發(fā)明方法適用于所有有唯一主鍵功能的數(shù)據(jù)庫(kù),包括主流的關(guān)系型數(shù)據(jù)庫(kù)、nosql數(shù)據(jù)庫(kù)。
本方法的原理是抽取業(yè)務(wù)操作的關(guān)鍵數(shù)據(jù),組合成字符型主鍵值,為了提高主鍵索引的性能,采用哈希算法,將主鍵值Hash成16位字符的關(guān)鍵字作為數(shù)據(jù)表的主鍵,插入到主鍵數(shù)據(jù)表中;由于數(shù)據(jù)庫(kù)的表主鍵具有唯一性,即主鍵值不能重復(fù),而且哈希值具有代表唯一性,則不同的業(yè)務(wù)關(guān)鍵數(shù)據(jù)哈希值不相同,如果不同的哈希值插入到主鍵數(shù)據(jù)表中,則不會(huì)引發(fā)主鍵重復(fù)的異常,相反,如果插入了相同的哈希值則會(huì)引發(fā)主鍵異常,表明數(shù)據(jù)重復(fù)或數(shù)據(jù)沖突,這樣利用數(shù)據(jù)庫(kù)的主鍵唯一性,判斷業(yè)務(wù)操作是否唯一,避免數(shù)據(jù)沖突,保證事務(wù)數(shù)據(jù)一致。
本發(fā)明方法的適用場(chǎng)景可以有以下場(chǎng)景:第一、賬號(hào)注冊(cè),防止重名注冊(cè),其中hash關(guān)鍵數(shù)據(jù)為用戶賬號(hào);第二、消息發(fā)送,防止相同短信、郵件重復(fù)發(fā)送,其中hash關(guān)鍵數(shù)據(jù)為接收人、消息內(nèi)容和時(shí)間;第三、一次限購(gòu),防止超額購(gòu)買,hash關(guān)鍵數(shù)據(jù)為用戶賬號(hào)和商品編號(hào);第四、余額取款,hash關(guān)鍵數(shù)據(jù)賬號(hào)ID、余額和時(shí)間。在此僅僅是列舉出可以使用本發(fā)明方法的場(chǎng)景,并不限于此。
在本實(shí)施例中,再對(duì)余額取款來(lái)進(jìn)行進(jìn)一步的詳細(xì)說(shuō)明:
S1:在數(shù)據(jù)庫(kù)中額外創(chuàng)建一張主鍵表,字段中必須包括字符型唯一主鍵,數(shù)據(jù)結(jié)果大致如下:KeyTable{keyid[primary,char(16)],createdate[datetime]};
S2:在具體業(yè)務(wù)請(qǐng)求流程中,程序提取業(yè)務(wù)關(guān)鍵的數(shù)據(jù),例如余額取款中,關(guān)鍵數(shù)據(jù)如下:余額、賬號(hào)ID和時(shí)間;
S3:對(duì)關(guān)鍵數(shù)據(jù)排序、合并成字符,如:賬號(hào)ID+余額+時(shí)間;
S4:對(duì)合并后的字符轉(zhuǎn)為Hash值,如093dd0fec383a9d9;
S5:將Hash值插入到主鍵表中,如果插入成功,則不存在重復(fù)主鍵,表示事物數(shù)據(jù)一致,可以繼續(xù)業(yè)務(wù)流程操作,如果數(shù)據(jù)庫(kù)跑出主鍵重復(fù)異常,則表明相同賬號(hào)相同余額在一分鐘內(nèi)重復(fù)提款2次或以上,余額數(shù)據(jù)沖突,存在交易風(fēng)險(xiǎn),取款流程應(yīng)該中斷返回。
如圖2所示,本發(fā)明提供了一種用主鍵唯一性實(shí)現(xiàn)事務(wù)操作的裝置,包括以下模塊:
主鍵表創(chuàng)建模塊:用于在數(shù)據(jù)庫(kù)中創(chuàng)建一張主鍵表;
業(yè)務(wù)數(shù)據(jù)提取模塊:用于提取業(yè)務(wù)操作中的業(yè)務(wù)操作數(shù)據(jù);
合并字符模塊:用于對(duì)業(yè)務(wù)操作數(shù)據(jù)排序,并合并成業(yè)務(wù)字符組;
哈希值轉(zhuǎn)換模塊:用于通過(guò)哈希算法對(duì)該業(yè)務(wù)字符組進(jìn)行哈希值轉(zhuǎn)換;所述哈希算法為MD5算法;
插入判斷模塊:用于將業(yè)務(wù)字符組插入主鍵表中,并判斷是否插入成功,如果插入成功,則執(zhí)行相對(duì)應(yīng)的業(yè)務(wù)操作,如果插入失敗,則停止業(yè)務(wù)操作。
對(duì)本領(lǐng)域的技術(shù)人員來(lái)說(shuō),可根據(jù)以上描述的技術(shù)方案以及構(gòu)思,做出其它各種相應(yīng)的改變以及形變,而所有的這些改變以及形變都應(yīng)該屬于本發(fā)明權(quán)利要求的保護(hù)范圍之內(nèi)。