簡體   English   中英

管理對單個數據庫的多線程訪問的各種方式是什么?

[英]What are the various ways of managing multiple threads access to a single database?

我了解到的一種方法是在這些線程使用的單個連接上使用同步鎖:

synchronized(LOCK){
    // use connection by current thread containing
    // critical operations that may occur simultaneously.
}

還有其他(也許更聰明或更有效)的方法來管理對單個數據庫的多線程訪問嗎?

例如,使用數據庫引擎的內置支持來鎖定數據庫/表/行/等嗎? (如果是這樣,這在Java方面如何完成?這是SELECT語句的一部分嗎?還是在使用連接之前給出了某些指令?)

並發管理通常被視為數據庫的一項功能(因此,它也應承擔責任),而不是客戶端代碼中要解決的問題(在這種情況下,“客戶端”是指“數據庫的客戶端”)。 換句話說,如果您開始嘗試在客戶端代碼中管理並發性,則實際上是在嘗試管理數據庫操作的調度任務,這使您在自己的代碼中實現數據庫的方式大約減少了四分之一。 這不僅是自己編寫數據庫的大量工作,而且可以說是編寫數據庫最困難的部分。

考慮到這一點...

數據庫管理多個並發連接,並且大多數數據庫具有事務功能,該功能允許同時創建一系列游標和/或事務。 最常見的情況是像Postgres這樣的數據庫,在該數據庫中,同時發生的兩個事務各自具有與開始各自事務時相同的數據視圖。 如果所進行的操作不會互相干擾,那么內部發生的事情並不重要,它們都將以外部觀察者始終能獲得一致的數據庫狀態視圖的方式進行解析-是否一致的結果是以稍微過時(但很快)或緩慢(但總是准確)為代價的,這是設計中要權衡的。

您確實遇到了需要執行更新的情況,該更新將影響數據庫的很大一部分,並且您需要將其他用戶拒之門外,並迫使他們等待直到您的特殊操作完成(否則可能會導致一系列事務失敗) 。 大多數數據庫允許對模式,表,列,行等進行鎖定,並具有多種鎖定類型:插入,選擇,更新等,以及用於暫時掛起完整性檢查並在鎖定結束時全部應用它們的機制事務,以及許多其他功能,這些功能可以幫助您真正需要在數據庫中做一些神奇的事情。

這在客戶端代碼中如何顯示? 這取決於您是否在數據庫中編寫存儲過程(以便在函數調用后隱藏一些復雜的操作),在客戶端代碼中手動編寫查詢,使用混合方法以及數據庫是否具有大型數據庫。一組預構建函數,用於處理大多數明顯的情況,例如需要鎖定之類的東西。 但是, 最常見的情況是, 您無需考慮絕大多數數據庫操作的並發性

您將需要建立連接。 通常,這是通過創建主應用程序共享的連接池(工作線程/進程)來完成的,並且池庫將提供隊列或消息框抽象,以將您的請求序列化到連接池。 有時直接連接(1個客戶端== 1個連接)方法就完全足夠了(實際上在大多數情況下就足夠了,但是我們所有人都喜歡展示池化技術的出色表現...)。 有時您將有幾種不同類型的應用程序一次連接到一個數據庫。

考慮一個提供本地桌面客戶端的應用程序服務器,提供對數據庫的只讀訪問權的移動應用程序服務,文檔導出實用程序,處理產品交易數據的倉庫或POS系統以及該系統的Web報告界面。 對我來說,更常見的情況是游戲服務器,它們都可以訪問和更新中央數據源,而Web論壇和“軍械庫”類型的報告界面可以從其他地方訪問相同的數據。 無法跨多種類型的客戶端處理客戶端代碼中的並發。 謝天謝地,這些功能已經內置在大多數數據庫中!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM