本發(fā)明涉及一種數(shù)據(jù)庫高并發(fā)事務(wù)合并方法,屬于數(shù)據(jù)庫數(shù)據(jù)復(fù)制技術(shù)領(lǐng)域。
背景技術(shù):
隨著信息技術(shù)的深入發(fā)展,應(yīng)用系統(tǒng)的不斷升級,系統(tǒng)之間的集成貫通越來越多的需要數(shù)據(jù)交互,數(shù)據(jù)抽取已經(jīng)逐步成為了信息系統(tǒng)融合的關(guān)鍵部分。然而,由于事務(wù)的一致性要求,數(shù)據(jù)復(fù)制過程中事務(wù)合并提交技術(shù)一直是關(guān)鍵核心技術(shù),源端一次事務(wù)操作,正常抽取出來會變成海量的小事務(wù)操作數(shù)據(jù),造成整個復(fù)制效率極其低下。
技術(shù)實現(xiàn)要素:
為了解決上述技術(shù)問題,本發(fā)明提供了一種數(shù)據(jù)庫高并發(fā)事務(wù)合并方法。
為了達到上述目的,本發(fā)明所采用的技術(shù)方案是:
一種數(shù)據(jù)庫高并發(fā)事務(wù)合并方法,包括以下步驟,
從事務(wù)池中批量獲取待合并的事務(wù);
根據(jù)事務(wù)內(nèi)部操作的時間順序,對事務(wù)內(nèi)部操作進行合并;
根據(jù)事務(wù)提交順序,對內(nèi)部操作合并后的事務(wù)間的操作進行合并,并將合并后的事務(wù)依次提交事物庫。
事務(wù)內(nèi)部操作合并的過程為,
讀取相鄰兩條操作,獲取操作的類型,比較兩條操作的類型,按照類型進行事務(wù)內(nèi)部操作合并。
按照類型進行事務(wù)內(nèi)部操作合并,具體如下,
定義前一條操作為a,后一條操作為b,a和b合并后為c;
當a的類型為null,b的類型為insert時,合并后c的類型為insert,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù);
當a的類型為null,b的類型為delete時,合并后c的類型為delete,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù);
當a的類型為null,b的類型為update時,合并后c的類型為update,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù);
當a的類型為insert,b的類型為insert時,違反事務(wù)特性,合并異常;
當a的類型為insert,b的類型為update時,合并后c的類型為uapdate,合并后c的數(shù)據(jù)為a的原始數(shù)據(jù)加上b的原始數(shù)據(jù);
當a的類型為insert,b的類型為delete時,合并后c的類型為delete,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù);
當a的類型為delete,b的類型為insert時,合并后c的類型為insert,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù);
當a的類型為delete,b的類型為update時,違反事務(wù)特性,合并異常;
當a的類型為delete,b的類型為delete時,合并后c的類型為delete,合并后c的數(shù)據(jù)為a的原始數(shù)據(jù)加上b的原始數(shù)據(jù);
當a的類型為update,b的類型為insert時,違反事務(wù)特性,合并異常;
當a的類型為update,b的類型為update時,合并后c的類型為update,合并后c的數(shù)據(jù)為a的原始數(shù)據(jù)加上b的原始數(shù)據(jù);
當a的類型為update,b的類型為delete時,合并后c的類型為delete,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù)。
事務(wù)間的操作合并的過程為,
讀取相鄰事務(wù)的操作,獲取操作的類型,比較相鄰事務(wù)操作的類型,按照類型進行事務(wù)間操作合并。
按照類型進行事務(wù)間操作合并,具體如下,
定義前一事務(wù)的操作為c1,后一事務(wù)的操作為c2,c1和c2合并后為c3;
當c1的類型為null,c2的類型為insert時,合并后c3的類型為insert,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù);
當c1的類型為null,c2的類型為delete時,合并后c3的類型為delete,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù);
當c1的類型為null,c2的類型為update時,合并后c3的類型為update,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù);
當c1的類型為insert,c2的類型為insert時,違反事務(wù)特性,合并異常;
當c1的類型為insert,c2的類型為update時,合并insert,合并后c3的類型為uapdate,合并后c3的數(shù)據(jù)為c1的原始數(shù)據(jù)加上c2的原始數(shù)據(jù);
當c1的類型為insert,c2的類型為delete時,合并后c3的類型為delete,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù);
當c1的類型為delete,c2的類型為insert時,合并后c3的類型為insert,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù);
當c1的類型為delete,c2的類型為update時,違反事務(wù)特性,合并異常;
當c1的類型為delete,c2的類型為delete時,合并后c3的類型為delete,合并后c3的數(shù)據(jù)為c2的數(shù)據(jù);
當c1的類型為update,c2的類型為insert時,違反事務(wù)特性,合并異常;
當c1的類型為update,c2的類型為update時,合并后c3的類型為update,合并后c3的數(shù)據(jù)為c1的數(shù)據(jù)加上c2的數(shù)據(jù);
當c1的類型為update,c2的類型為delete時,合并后c3的類型為delete,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù)。
讀取事務(wù)操作時,將每條操作存入表中,數(shù)據(jù)的主鍵作為表的key,如果沒有主鍵,則增加附加日志作為key,類型和數(shù)據(jù)作為表的value。
本發(fā)明所達到的有益效果:本發(fā)明通過對比數(shù)據(jù)庫事務(wù)操作類型前后關(guān)系,將從數(shù)據(jù)庫抽取出來的海量事務(wù)按照操作時間、操作類型進行事務(wù)內(nèi)部合并,然后再將合并后的事務(wù)進行事務(wù)間合并;通過該方法不但可以提高數(shù)據(jù)庫入庫效率,降低數(shù)據(jù)庫性能影響,同時可以有效地提升數(shù)據(jù)復(fù)制延時,對確保數(shù)據(jù)庫的安全穩(wěn)定的運行,具有重要的實際意義。
附圖說明
圖1為本發(fā)明的流程圖;
圖2為基于邏輯級的數(shù)據(jù)庫抽取復(fù)制的架構(gòu)圖。
具體實施方式
下面結(jié)合附圖對本發(fā)明作進一步描述。以下實施例僅用于更加清楚地說明本發(fā)明的技術(shù)方案,而不能以此來限制本發(fā)明的保護范圍。
如圖1所示,一種數(shù)據(jù)庫高并發(fā)事務(wù)合并方法,包括以下步驟:
步驟1,從事務(wù)池中批量獲取待合并的事務(wù)。
步驟2,根據(jù)事務(wù)內(nèi)部操作的時間順序,對事務(wù)內(nèi)部操作進行合并。
具體過程為:讀取相鄰兩條操作,獲取操作的類型(插入insert、刪除delete、更新update、無null),比較兩條操作的類型,按照類型進行事務(wù)內(nèi)部操作合并。
按照類型進行事務(wù)內(nèi)部操作合并,具體如下:
定義前一條操作為a,后一條操作為b,a和b合并后為c;
當a的類型為null,b的類型為insert時,合并后c的類型為insert,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù);
當a的類型為null,b的類型為delete時,合并后c的類型為delete,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù);
當a的類型為null,b的類型為update時,合并后c的類型為update,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù);
當a的類型為insert,b的類型為insert時,違反事務(wù)特性,合并異常;
當a的類型為insert,b的類型為update時,合并后c的類型為uapdate,合并后c的數(shù)據(jù)為a的原始數(shù)據(jù)加上b的原始數(shù)據(jù);
當a的類型為insert,b的類型為delete時,合并后c的類型為delete,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù);
當a的類型為delete,b的類型為insert時,合并后c的類型為insert,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù);
當a的類型為delete,b的類型為update時,違反事務(wù)特性,合并異常;
當a的類型為delete,b的類型為delete時,合并后c的類型為delete,合并后c的數(shù)據(jù)為a的原始數(shù)據(jù)加上b的原始數(shù)據(jù);
當a的類型為update,b的類型為insert時,違反事務(wù)特性,合并異常;
當a的類型為update,b的類型為update時,合并后c的類型為update,合并后c的數(shù)據(jù)為a的原始數(shù)據(jù)加上b的原始數(shù)據(jù);
當a的類型為update,b的類型為delete時,合并后c的類型為delete,合并后c的數(shù)據(jù)為b的原始數(shù)據(jù)。
步驟3,根據(jù)事務(wù)提交順序,對內(nèi)部操作合并后的事務(wù)間的操作進行合并,并將合并后的事務(wù)依次提交事物庫。
具體過程為:讀取相鄰事務(wù)的操作,獲取操作的類型(插入insert、刪除delete、更新update、無null),比較相鄰事務(wù)操作的類型,按照類型進行事務(wù)間操作合并。
按照類型進行事務(wù)間操作合并,具體如下:
定義前一事務(wù)的操作為c1,后一事務(wù)的操作為c2,c1和c2合并后為c3;
當c1的類型為null,c2的類型為insert時,合并后c3的類型為insert,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù);
當c1的類型為null,c2的類型為delete時,合并后c3的類型為delete,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù);
當c1的類型為null,c2的類型為update時,合并后c3的類型為update,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù);
當c1的類型為insert,c2的類型為insert時,違反事務(wù)特性,合并異常;
當c1的類型為insert,c2的類型為update時,合并insert,合并后c3的類型為uapdate,合并后c3的數(shù)據(jù)為c1的原始數(shù)據(jù)加上c2的原始數(shù)據(jù);
當c1的類型為insert,c2的類型為delete時,合并后c3的類型為delete,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù);
當c1的類型為delete,c2的類型為insert時,合并后c3的類型為insert,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù);
當c1的類型為delete,c2的類型為update時,違反事務(wù)特性,合并異常;
當c1的類型為delete,c2的類型為delete時,合并后c3的類型為delete,合并后c3的數(shù)據(jù)為c2的數(shù)據(jù);
當c1的類型為update,c2的類型為insert時,違反事務(wù)特性,合并異常;
當c1的類型為update,c2的類型為update時,合并后c3的類型為update,合并后c3的數(shù)據(jù)為c1的數(shù)據(jù)加上c2的數(shù)據(jù);
當c1的類型為update,c2的類型為delete時,合并后c3的類型為delete,合并后c3的數(shù)據(jù)為c2的原始數(shù)據(jù)。
在步驟2和步驟3讀取事務(wù)操作時,將每條操作存入表(一般采用map表)中,數(shù)據(jù)的主鍵作為表的key,如果沒有主鍵,則增加附加日志作為key,類型和數(shù)據(jù)作為表的value。
本發(fā)明的原理如圖2所示,上述方法采用線程的方式批量進行事務(wù)內(nèi)部合并,并將合并后的結(jié)果再次進行事務(wù)之間事務(wù)合并,最后將合并后的結(jié)果提交入庫,通過該方法不但可以提高數(shù)據(jù)庫入庫效率,降低數(shù)據(jù)庫性能影響,同時可以有效地提升數(shù)據(jù)復(fù)制延時,對確保數(shù)據(jù)庫的安全穩(wěn)定的運行,具有重要的實際意義。
以上所述僅是本發(fā)明的優(yōu)選實施方式,應(yīng)當指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明技術(shù)原理的前提下,還可以做出若干改進和變形,這些改進和變形也應(yīng)視為本發(fā)明的保護范圍。