本申請涉及計算機技術領域,具體涉及一種避免線程并發訪問數據庫的方法和裝置。
背景技術:
為了提高操作系統在單位時間內的處理效率,常常會使用并發的方法,并發是指在操作系統中,由多個線程在同一時間段內同時運行一個業務程序的處理過程。當多個線程在同時運行一個業務程序的處理過程中,多個線程中某幾個線程需要同時訪問同一數據庫進行相同操作(比如對同一數據進行加減操作)時,可能會引起沖突。為了避免上述沖突,引入了互斥鎖的概念,通過互斥鎖來保證在任一時刻,進行相同操作的某幾個線程中只有一個線程訪問該數據庫。
現有技術中,對數據庫訪問的線程的互斥鎖是將數據庫的唯一性索引作為要素得到的,唯一索引具有唯一性,由相同索引作為要素得到的互斥鎖才可以互斥,比如互斥鎖1的要素是a、b和c,互斥鎖2的要素是a、b和c,此時由于所述互斥鎖1和互斥鎖2的要素相同(都是a、b、c),因此互斥,所述互斥鎖1和互斥鎖2對應的線程不能同時訪問同一數據庫。然而,對于有些業務程序,不但需要避免相同操作的線程并發訪問同一數據庫,而且也需要避免不同操作的線程并發訪問同一數據庫,比如互斥鎖1的要素是a、b和c,互斥鎖2的要素是a、d和e,此時由于互斥鎖1和互斥鎖2的要素不一致,因此不互斥,所述互斥鎖1和互斥鎖2對應的線程可以同時訪問同一數據庫。
綜上所述,現有技術中存在無法避免不同操作的線程并發訪問同一數據庫的問題。
技術實現要素:
為了解決現有技術中存在無法避免不同操作的線程并發訪問同一數據庫的問題,本申請提供了一種避免線程并發訪問數據庫的方法和裝置具體是這樣實現的:
一種避免線程并發訪問數據庫的方法,所述方法包括:
當預設業務程序的第一線程和第二線程同時訪問預設數據庫時,獲取所述預設業務程序的互斥鎖池;其中,所述互斥鎖池中存儲有將所述預設業務程序的指定要素進行遍歷組合得到的多種互斥鎖;
判斷所述第一線程的互斥鎖和第二線程的互斥鎖是否同時位于所述互斥鎖池中;
若是,則判定所述第一線程和第二線程不能同時訪問所述預設數據庫。
一種避免線程并發訪問數據庫的方法,所述方法包括:
當預設業務程序的第一線程訪問預設數據庫時,獲取所述預設業務程序的互斥鎖池,以及所述互斥鎖池對應的適配互斥鎖;其中,所述互斥鎖池中存儲有將所述預設業務程序的指定要素進行遍歷組合得到的多種互斥鎖;
若所述第一線程的互斥鎖位于所述互斥鎖池中,則將所述第一線程的互斥鎖轉換為所述互斥鎖池對應的適配互斥鎖,并將所述第一線程的適配互斥鎖插入所述預設數據庫中;
當所述預設業務程序的第二線程訪問所述預設數據庫時,判斷所述第二線程的互斥鎖是否位于所述互斥鎖池中;
若是,則將所述第二線程的互斥鎖轉換為所述互斥鎖池對應的適配互斥鎖,并將所述第二線程的所述適配互斥鎖與所述預設數據庫中已插入的所述適配互斥鎖進行比較;
若判定所述第二線程的所述適配互斥鎖與所述預設數據庫中的所述適配互斥鎖互斥,則所述第二線程不能訪問所述預設數據庫。
一種避免線程并發訪問數據庫的裝置,所述裝置包括:
第一獲取模塊,用于當預設業務程序的第一線程和第二線程同時訪問預設數據庫時,獲取所述預設業務程序的互斥鎖池;其中,所述互斥鎖池中存儲有將所述預設業務程序的指定要素進行遍歷組合得到的多種互斥鎖;
判斷模塊,用于判斷所述第一線程的互斥鎖和第二線程的互斥鎖是否同時位于所述互斥鎖池中;
處理模塊,用于在所述第一線程的互斥鎖和第二線程的互斥鎖同時位于所述互斥鎖池中時,判定所述第一線程和第二線程不能同時訪問所述預設數據庫。
一種避免線程并發訪問數據庫的裝置,所述裝置包括:
第一獲取模塊,用于當預設業務程序的第一線程訪問預設數據庫時,獲取所述預設業務程序的互斥鎖池,以及所述互斥鎖池對應的適配互斥鎖;其中,所述互斥鎖池中存儲有將所述預設業務程序的指定要素進行遍歷組合得到的多種互斥鎖;
第一轉換模塊,用于若所述第一線程的互斥鎖位于所述互斥鎖池中,則將所述第一線程的互斥鎖轉換為所述互斥鎖池對應的適配互斥鎖,并將所述第一線程的適配互斥鎖插入所述預設數據庫中;
判斷模塊,用于當所述預設業務程序的第二線程訪問所述預設數據庫時,判斷所述第二線程的互斥鎖是否位于所述互斥鎖池中;
第二轉換模塊,用于在所述第二線程的互斥鎖位于所述互斥鎖池中時,將所述第二線程的互斥鎖轉換為所述互斥鎖池對應的適配互斥鎖;
處理模塊,用于將所述第二線程的所述適配互斥鎖與所述預設數據庫中已插入的所述適配互斥鎖進行比較,判定所述第二線程的所述適配互斥鎖與所述預設數據庫中的所述適配互斥鎖互斥時,所述第二線程不能訪問所述預設數據庫。
與現有技術相比,本申請可以獲得包括以下技術效果:
1)在第一線程和第二線程同時訪問預設數據庫時,只要所述第一線程的互斥鎖和第二線程的互斥鎖同時位于所述互斥鎖池中,即使所述第一線程的互斥鎖和第二線程的互斥鎖不相同,也可以判斷所述第一線程和第二線程 不能同時訪問所述預設數據庫,如此實現避免不同操作的線程并發訪問同一數據庫。
2)將第一線程的互斥鎖位于互斥鎖池時可以將其轉換為所述互斥鎖池對應的適配互斥鎖,并將第一線程的適配互斥鎖插入預設數據庫中;在第二線程訪問所述預設數據庫時,如果所述第二線程的互斥鎖也位于所述互斥鎖池中,也將其轉化為所述互斥鎖池對應的適配互斥鎖。如此,由于第二線程的適配互斥鎖與所述預設數據庫中插入的適配互斥鎖相同,就可以判斷所述第二線程不能訪問所述預設數據庫。這樣,即使第二線程的互斥鎖與第一線程的互斥鎖不相同,也可以實現避免不同操作的線程并發訪問同一數據庫。
附圖說明
此處所說明的附圖用來提供對本申請的進一步理解,構成本申請的一部分,本申請的示意性實施例及其說明用于解釋本申請,并不構成對本申請的不當限定。在附圖中:
圖1是本申請一實施例提供的一種避免線程并發訪問數據庫的方法流程圖;
圖2是本申請一實施例提供的一種避免線程并發訪問數據庫的方法流程圖;
圖3是本申請實施例的一種互斥鎖池的示意圖;
圖4是是本申請一實施例提供的一種避免線程并發訪問數據庫的方法流程圖;
圖5是本申請實施例的第三種避免線程并發訪問數據庫的裝置結構示意圖;
圖6是本申請實施例的第三種避免線程并發訪問數據庫的裝置結構示意圖;
圖7是本申請實施例的第三種避免線程并發訪問數據庫的裝置結構示意圖;
圖8是本申請實施例的第三種避免線程并發訪問數據庫的裝置結構示 意圖。
具體實施方式
以下將配合附圖及實施例來詳細說明本申請的實施方式,藉此對本申請如何應用技術手段來解決技術問題并達成技術功效的實現過程能充分理解并據以實施。
在一個典型的配置中,計算設備包括一個或多個處理器(cpu)、輸入/輸出接口、網絡接口和內存。
內存可能包括計算機可讀介質中的非永久性存儲器,隨機存取存儲器(ram)和/或非易失性內存等形式,如只讀存儲器(rom)或閃存(flashram)。內存是計算機可讀介質的示例。
計算機可讀介質包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術來實現信息存儲。信息可以是計算機可讀指令、數據結構、程序的模塊或其他數據。計算機的存儲介質的例子包括,但不限于相變內存(pram)、靜態隨機存取存儲器(sram)、動態隨機存取存儲器(dram)、其他類型的隨機存取存儲器(ram)、只讀存儲器(rom)、電可擦除可編程只讀存儲器(eeprom)、快閃記憶體或其他內存技術、只讀光盤只讀存儲器(cd-rom)、數字多功能光盤(dvd)或其他光學存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設備或任何其他非傳輸介質,可用于存儲可以被計算設備訪問的信息。按照本文中的界定,計算機可讀介質不包括非暫存電腦可讀媒體(transitorymedia),如調制的數據信號和載波。
如在說明書及權利要求當中使用了某些詞匯來指稱特定組件。本領域技術人員應可理解,硬件制造商可能會用不同名詞來稱呼同一個組件。本說明書及權利要求并不以名稱的差異來作為區分組件的方式,而是以組件在功能上的差異來作為區分的準則。如在通篇說明書及權利要求當中所提及的“包含”為一開放式用語,故應解釋成“包含但不限定于”。“大致”是指在可接收的誤差范圍內,本領域技術人員能夠在一定誤差范圍內解決所述技術問題,基本達到所述技術效果。此外,“耦接”一詞在此包含任何直接及間接的電性耦接手段。因此,若文中描述一第一裝置耦接于一第二裝置,則代表所述第 一裝置可直接電性耦接于所述第二裝置,或通過其他裝置或耦接手段間接地電性耦接至所述第二裝置。說明書后續描述為實施本發明的較佳實施方式,然所述描述乃以說明本發明的一般原則為目的,并非用以限定本發明的范圍。本發明的保護范圍當視所附權利要求所界定者為準。
還需要說明的是,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的商品或者系統不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種商品或者系統所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的商品或者系統中還存在另外的相同要素。
實施例描述
下面以一實施例對本申請方法的實現作進一步說明。如圖1所示,為本申請實施例的一種避免線程并發訪問數據庫的方法流程圖,該方法包括:
s101:當預設業務程序的第一線程和第二線程同時訪問預設數據庫時,獲取所述預設業務程序的互斥鎖池。
本實施例中,所述預設業務程序可以是需要實現避免不同操作的線程并發訪問同一數據庫的任何業務程序。
所述第一線程和第二線程可以是不同操作的線程。
所述互斥鎖池中存儲有將預設業務程序的指定要素進行遍歷組合得到的多種互斥鎖。互斥鎖池是在執行本步驟之前預先生成,具體生成過程參見圖2,在圖2對應的內容進行了詳細描述。
參見圖2,在本實施例的一優選實施例中,在步驟s101當預設業務程序的第一線程和第二線程同時訪問預設數據庫時,獲取所述預設業務程序的互斥鎖池之前,還包括如下步驟:
s105:獲取預設業務程序的指定要素。
例如:預設業務程序的全部要素為:a,b,c,d。設置預設業務程序的指定要素是預設業務程序的全部要素,即此處預設業務程序的指定要素為:a,b,c,d。
s106:將指定要素進行遍歷組合,每一種組合的要素設置一個互斥鎖,得到多種互斥鎖。
例如:預設業務程序的指定要素為:a,b,c,d,將指定要素進行遍歷組合得到:a,b,c,d,(a,b),(a,c),(a,d),(b,c),(b,d),(c,d),(a,b,c),(a,b,d),(b,c,d),(a,b,c,d)。每一種組合的要素設置一個互斥鎖,得到多種互斥鎖為:互斥鎖a,互斥鎖b,互斥鎖c,互斥鎖d,互斥鎖(a,b),互斥鎖(a,c),互斥鎖(a,d),互斥鎖(b,c),互斥鎖(b,d),互斥鎖(c,d),互斥鎖(a,b,c),互斥鎖(a,b,d),互斥鎖(b,c,d),互斥鎖(a,b,c,d)。
s107:將多種互斥鎖存儲在互斥鎖池中。
具體地,參見圖3,將多種互斥鎖存儲在互斥鎖池中得到互斥鎖池。
通過本實施例,將預設業務程序的指定要素進行遍歷組合,每一種組合的要素設置一個互斥鎖,得到多種互斥鎖,將多種互斥鎖存儲在互斥鎖池中得到互斥鎖池,可以將任何線程的要素作為指定要素,將預設業務程序的任何線程的互斥鎖都存儲在互斥鎖池中,可以實現避免預設業務程序的任何線程并發訪問同一數據庫。
s102:判斷所述第一線程的互斥鎖和第二線程的互斥鎖是否同時位于所述互斥鎖池中。
判斷所述第一線程的互斥鎖和第二線程的互斥鎖是否同時位于所述互斥鎖池中。如果所述第一線程的互斥鎖和第二線程的互斥鎖同時位于所述互斥鎖池中,則執行步驟s103。
s103:若是,則判定所述第一線程和第二線程不能同時訪問所述預設數據庫。
如果所述第一線程的互斥鎖和第二線程的互斥鎖同時位于所述互斥鎖池中,則判定所述第一線程和第二線程不能同時訪問所述預設數據庫。
需要說明的是,當第二線程之后有第三線程、第四線程等訪問預設數據庫時,與第二線程的處理過程類似,第三線程、第四線程也不能訪問預設數據庫。
通過本實施例,在第一線程和第二線程同時訪問預設數據庫時,只要所述第一線程的互斥鎖和第二線程的互斥鎖同時位于所述互斥鎖池中,即使所述第一線程的互斥鎖和第二線程的互斥鎖不相同,也可以判斷所述第一線程和第二線程不能同時訪問所述預設數據庫,如此實現避免不同操作的線程并發訪問同一數據庫。
如圖4所示,為本申請實施例的一種避免線程并發訪問數據庫的方法流程圖,該方法包括:
s201:當預設業務程序的第一線程訪問預設數據庫時,獲取所述預設業務程序的互斥鎖池,以及所述互斥鎖池對應的適配互斥鎖。
本實施例與上述實施例不同之處在于,第一線程和第二線程并不是同時訪問預設數據庫的,而是第一線程先訪問預設數據庫,然后第二線程再訪問預設數據庫時,并且第一線程沒有結束訪問預設數據庫,這樣就會出現不同操作的線程并發訪問預設數據庫的情況。
所述當預設業務程序的第一線程訪問預設數據庫時,獲取所述預設業務程序的互斥鎖池與上述實施例中步驟s101相同,此處不再贅述。
所述適配互斥鎖可以是指包括預設業務程序的指定要素的互斥鎖,或包括預設業務程序的要素之外的其他要素的互斥鎖。預設業務程序的指定要素可以是預設業務程序的全部要素、預設業務程序的部分要素等。參照上述實施例中步驟106所述的例子,適配互斥鎖可以是包括預設業務程序的指定要素的互斥鎖(如互斥鎖(a,b,c,d)、互斥鎖c、互斥鎖(a,b)等),適配互斥鎖還可以是包括預設業務程序的要素之外的其他要素的互斥鎖(如互斥鎖t)。
s202:若所述第一線程的互斥鎖位于所述互斥鎖池中,則將所述第一線程的互斥鎖轉換為所述互斥鎖池對應的適配互斥鎖,并將所述第一線程的適配互斥鎖插入所述預設數據庫中。
具體地,如果所述第一線程的互斥鎖位于所述互斥鎖池中,則獲取預設業務程序的互斥鎖池對應的適配互斥鎖;將所述第一線程的互斥鎖轉換為所 述互斥鎖池對應的適配互斥鎖;將所述第一線程的適配互斥鎖插入所述預設數據庫中。
s203:當所述預設業務程序的第二線程訪問所述預設數據庫時,判斷所述第二線程的互斥鎖是否位于所述互斥鎖池中。
當所述預設業務程序的第二線程訪問所述預設數據庫時,由于第一線程還在訪問所述預設數據庫,所以需要判斷第二線程的互斥鎖和已插入所述預設數據庫中適配互斥鎖是否互斥。當然在判斷之前,還需要判斷所述第二線程的互斥鎖是否位于所述互斥鎖池中;如果所述第二線程的互斥鎖不位于所述互斥鎖池中,則顯然所述第二線程的互斥鎖與所述預設數據庫中適配互斥鎖不互斥,不影響第二線程的訪問;但是,如果所述第二線程的互斥鎖位于所述互斥鎖池中,則執行步驟s204。
s204:若是,則將所述第二線程的互斥鎖轉換為所述互斥鎖池對應的適配互斥鎖,并將所述第二線程的所述適配互斥鎖與所述預設數據庫中已插入的所述適配互斥鎖進行比較。
如果所述第二線程的互斥鎖位于所述互斥鎖池中,將所述第二線程的互斥鎖轉換為所述互斥鎖池對應的適配互斥鎖。進而將所述第二線程的所述適配互斥鎖與所述預設數據庫中已插入的所述適配互斥鎖進行比較。
s205:若判定所述第二線程的所述適配互斥鎖與所述預設數據庫中的所述適配互斥鎖互斥,則所述第二線程不能訪問所述預設數據庫。
如果判定所述第二線程的所述適配互斥鎖與所述預設數據庫中的所述適配互斥鎖互斥,則所述第二線程不能訪問所述預設數據庫。
通過本實施例,將第一線程的互斥鎖位于互斥鎖池時可以將其轉換為所述互斥鎖池對應的適配互斥鎖,并將第一線程的適配互斥鎖插入預設數據庫中;在第二線程訪問所述預設數據庫時,如果所述第二線程的互斥鎖也位于所述互斥鎖池中,也將其轉化為所述互斥鎖池對應的適配互斥鎖。如此,由于第二線程的適配互斥鎖與所述預設數據庫中插入的適配互斥鎖相同,就可以判斷所述第二線程不能訪問所述預設數據庫。這樣,即使第二線程的互斥鎖與第一線程的互斥鎖不相同,也可以實現避免不同操作的線程并發訪問同 一數據庫。
與上述方法流程對應的,本申請的實施例還提供了一種數值輸入裝置。該裝置可以通過軟件實現,也可以通過硬件或者軟硬件結合的方式實現。以軟件實現為例,作為邏輯意義上的裝置,是通過服務器的中央處理器(centralprocessunit,cpu)將對應的計算機程序指令讀取到內存中運行形成的。
如圖5所示,是本申請實施例的一種避免線程并發訪問數據庫的裝置結構圖,該裝置包括:
第一獲取模塊301,用于當預設業務程序的第一線程和第二線程同時訪問預設數據庫時,獲取所述預設業務程序的互斥鎖池;其中,所述互斥鎖池中存儲有將所述預設業務程序的指定要素進行遍歷組合得到的多種互斥鎖;
判斷模塊302,用于判斷所述第一線程的互斥鎖和第二線程的互斥鎖是否同時位于所述互斥鎖池中;
處理模塊303,用于在所述第一線程的互斥鎖和第二線程的互斥鎖同時位于所述互斥鎖池中時,判定所述第一線程和第二線程不能同時訪問所述預設數據庫。
通過本實施例,在第一線程和第二線程同時訪問預設數據庫時,只要所述第一線程的互斥鎖和第二線程的互斥鎖同時位于所述互斥鎖池中,即使所述第一線程的互斥鎖和第二線程的互斥鎖不相同,也可以判斷所述第一線程和第二線程不能同時訪問所述預設數據庫,如此實現避免不同操作的線程并發訪問同一數據庫。
進一步地,參見圖6所示,在所述第一獲取模塊301之前該裝置還可以包括:
第二獲取模塊304,用于當預設業務程序的第一線程訪問預設數據庫時,獲取預設業務程序的互斥鎖池,以及互斥鎖池對應的適配互斥鎖之前獲取預設業務程序的指定要素;
設置模塊305,用于將指定要素進行遍歷組合,每一種組合的要素設置一個互斥鎖,得到多種互斥鎖;
配置模塊306,用于將多種互斥鎖存儲在互斥鎖池中。
通過本實施例,將預設業務程序的指定要素進行遍歷組合,每一種組合的要素設置一個互斥鎖,得到多種互斥鎖,將多種互斥鎖存儲在互斥鎖池中得到互斥鎖池,可以將任何線程的要素作為指定要素,將預設業務程序的任何線程的互斥鎖都存儲在互斥鎖池中,可以實現避免預設業務程序的任何線程并發訪問同一數據庫。
如圖7所示,是本申請實施例的一種避免線程并發訪問數據庫的裝置結構圖,該裝置包括:
第一獲取模塊401,用于當預設業務程序的第一線程訪問預設數據庫時,獲取所述預設業務程序的互斥鎖池,以及所述互斥鎖池對應的適配互斥鎖;其中,所述互斥鎖池中存儲有將所述預設業務程序的指定要素進行遍歷組合得到的多種互斥鎖;
本實施例中,所述適配互斥鎖包括所述預設業務程序的指定要素的互斥鎖;或者,所述預設業務程序的要素之外的其他要素的互斥鎖。
第一轉換模塊402,用于若所述第一線程的互斥鎖位于所述互斥鎖池中,則將所述第一線程的互斥鎖轉換為所述互斥鎖池對應的適配互斥鎖,并將所述第一線程的適配互斥鎖插入所述預設數據庫中;
判斷模塊403,用于當所述預設業務程序的第二線程訪問所述預設數據庫時,判斷所述第二線程的互斥鎖是否位于所述互斥鎖池中;
第二轉換模塊404,用于在所述第二線程的互斥鎖位于所述互斥鎖池中時,將所述第二線程的互斥鎖轉換為所述互斥鎖池對應的適配互斥鎖;
處理模塊405,用于將所述第二線程的所述適配互斥鎖與所述預設數據庫中已插入的所述適配互斥鎖進行比較,判定所述第二線程的所述適配互斥鎖與所述預設數據庫中的所述適配互斥鎖互斥時,所述第二線程不能訪問所述預設數據庫。
通過本實施例,將第一線程的互斥鎖位于互斥鎖池時可以將其轉換為所述互斥鎖池對應的適配互斥鎖,并將第一線程的適配互斥鎖插入預設數據庫 中;在第二線程訪問所述預設數據庫時,如果所述第二線程的互斥鎖也位于所述互斥鎖池中,也將其轉化為所述互斥鎖池對應的適配互斥鎖。如此,由于第二線程的適配互斥鎖與所述預設數據庫中插入的適配互斥鎖相同,就可以判斷所述第二線程不能訪問所述預設數據庫。這樣,即使第二線程的互斥鎖與第一線程的互斥鎖不相同,也可以實現避免不同操作的線程并發訪問同一數據庫。
進一步地,參見圖8所示,在所述第一獲取模塊401之前該裝置還可以包括:
第二獲取模塊404,用于當預設業務程序的第一線程訪問預設數據庫時,獲取預設業務程序的互斥鎖池,以及互斥鎖池對應的適配互斥鎖之前獲取預設業務程序的指定要素;
設置模塊405,用于將指定要素進行遍歷組合,每一種組合的要素設置一個互斥鎖,得到多種互斥鎖;
配置模塊406,用于將多種互斥鎖存儲在互斥鎖池中。
通過本實施例,將預設業務程序的指定要素進行遍歷組合,每一種組合的要素設置一個互斥鎖,得到多種互斥鎖,將多種互斥鎖存儲在互斥鎖池中得到互斥鎖池,可以將任何線程的要素作為指定要素,將預設業務程序的任何線程的互斥鎖都存儲在互斥鎖池中,可以實現避免預設業務程序的任何線程并發訪問同一數據庫。
上述說明示出并描述了本申請的若干優選實施例,但如前所述,應當理解本申請并非局限于本文所披露的形式,不應看作是對其他實施例的排除,而可用于各種其他組合、修改和環境,并能夠在本文所述發明構想范圍內,通過上述教導或相關領域的技術或知識進行改動。而本領域人員所進行的改動和變化不脫離本申請的精神和范圍,則都應在本申請所附權利要求的保護范圍內。