Ⅰ winform多線程操作MYsql需要加鎖不
需要加鎖,要保證同一時間段內只有一個線程在對資料庫進行操作
Ⅱ JAVA程序設計,多線程且避免死鎖
JAVA中幾種常見死鎖及對策:解決死鎖沒有簡單的方法,這是因為線程產生死鎖都各有各的原因,而且往往具有很高的負載。大多數軟體測試產生不了足夠多的負載,所以不可能暴露所有的線程錯誤。在這里中,下面將討論開發過程常見的4類典型的死鎖和解決對策。(1)資料庫死鎖在資料庫中,如果一個連接佔用了另一個連接所需的資料庫鎖,則它可以阻塞另一個連接。如果兩個或兩個以上的連接相互阻塞,則它們都不能繼續執行,這種情況稱為資料庫死鎖。資料庫死鎖問題不易處理,通常數據行進行更新時,需要鎖定該數據行,執行更新,然後在提交或回滾封閉事務時釋放鎖。由於資料庫平台、配置的隔離級以及查詢提示的不同,獲取的鎖可能是細粒度或粗粒度的,它會阻塞(或不阻塞)其他對同一數據行、表或資料庫的查詢。基於資料庫模式,讀寫操作會要求遍歷或更新多個索引、驗證約束、執行觸發器等。每個要求都會引入鎖。此外,其他應用程序還可能正在訪問同一資料庫模式中的某些對象,並獲取不同應用程序所具有的鎖。所有這些因素綜合在一起,資料庫死鎖幾乎不可能被消除了。值得慶幸的是,資料庫死鎖通常是可恢復的:當資料庫發現死鎖時,它會強制銷毀一個連接(通常是使用最少的連接),並回滾其事務。這將釋放所有與已經結束的事務相關聯的鎖,至少允許其他連接中有一個可以獲取它們正在被阻塞的鎖。由於資料庫具有這種典型的死鎖處理行為,所以當出現資料庫死鎖問題時,資料庫常常只能重試整個事務。當資料庫連接被銷毀時,會拋出可被應用程序捕獲的異常,並標識為資料庫死鎖。如果允許死鎖異常傳播到初始化該事務的代碼層之外,則該代碼層可以啟動一個新事務並重做先前所有工作。當出現問題就重試,由於資料庫可以自由地獲取鎖,所以幾乎不可能保證兩個或兩個以上的線程不發生資料庫死鎖。此方法至少能保證在出現某些資料庫死鎖情況時,應用程序能正常運行。(2)資源池耗盡死鎖客戶端的增加導致資源池耗盡死鎖是由於負載而造成的,即資源池太小,而每個線程需要的資源超過了池中的可用資源。假設連接池最多有10個連接,同時有10個對外部並發調用。這些線程中每一個都需要一個資料庫連接用來清空池。現在,每個線程都執行嵌套的調用。則所有線程都不能繼續,但又都不放棄自己的第一個資料庫連接。這樣,10個線程都將被死鎖。研究此類死鎖,會發現線程存儲中有大量等待獲取資源的線程,以及同等數量的空閑且未阻塞的活動資料庫連接。當應用程序死鎖時,如果可以在運行時檢測連接池,就能確認連接池實際上已空。修復此類死鎖的方法包括:增加連接池的大小或者重構代碼,以便單個線程不需要同時使用很多資料庫連接。或者可以設置內部調用使用不同的連接池,即使外部調用的連接池為空,內部調用也能使用自己的連接池繼續。(3)單線程、多沖突資料庫連接死鎖對同一線程執行嵌套的調用有時出現死鎖,此情形即使在非高負載系統中通常也會發生。當第一個(外部)連接已獲取第二個(內部)連接所需要的資料庫鎖,則第二個連接將永久阻塞第一個連接,並等待第一個連接被提交或回滾,這就出現了死鎖情形。因為資料庫沒有注意到兩個連接之間的關系,所以資料庫不會將此情形檢測為死鎖。這樣即使不存在並發,此代碼也將導致死鎖。此情形有多種具體的變種,可以涉及多個線程和兩個以上的資料庫連接。(4)Java虛擬機鎖與資料庫鎖沖突這種情形發生在資料庫鎖與Java虛擬機鎖並存的時候。在這種情況下,一個線程佔有一個資料庫鎖並嘗試獲取Java虛擬機鎖。同時,另一個線程佔有Java虛擬機鎖並嘗試獲取資料庫鎖。此時,資料庫發現一個連接阻塞了另一個連接,但由於無法阻止連接繼續,所以不會檢測到死鎖。Java虛擬機發現同步的鎖中有一個線程,並有另一個嘗試進入的線程,所以即使Java虛擬機能檢測到死鎖並對它們進行處理,它還是不會檢測到這種情況。總而言之,JAVA應用程序中的死鎖是一個大問題——它能導致整個應用程序慢慢終止,還很難被分離和修復,尤其是當開發人員不熟悉如何分析死鎖環境的時候。五.死鎖的經驗法則筆者在開發中總結以下死鎖問題的經驗。(1)對大多數的Java程序員來說最簡單的防止死鎖的方法是對競爭的資源引入序號,如果一個線程需要幾個資源,那麼它必須先得到小序號的資源,再申請大序號的資源。可以在Java代碼中增加同步關鍵字的使用,這樣可以減少死鎖,但這樣做也會影響性能。如果負載過重,資料庫內部也有可能發生死鎖。(2)了解資料庫鎖的發生行為。假定任何資料庫訪問都有可能陷入資料庫死鎖狀況,但是都能正確進行重試。例如了解如何從應用伺服器獲取完整的線程轉儲以及從資料庫獲取資料庫連接列表(包括互相阻塞的連接),知道每個資料庫連接與哪個Java線程相關聯。了解Java線程和資料庫連接之間映射的最簡單方法是向連接池訪問模式添加日誌記錄功能。(3)當進行嵌套的調用時,了解哪些調用使用了與其它調用同樣的資料庫連接。即使嵌套調用運行在同一個全局事務中,它仍將使用不同的資料庫連接,而不會導致嵌套死鎖。(4)確保在峰值並發時有足夠大的資源池。(5)避免執行資料庫調用或在佔有Java虛擬機鎖時,執行其他與Java虛擬機無關的操作。最重要的是,多線程設計雖然是困難的,但在開始編程之前詳細設計系統能夠幫助你避免難以發現死鎖的問題。死鎖在語言層面上不能解決,就需要一個良好設計來避免死鎖。
Ⅲ 多線程訪問同一個資料庫,需要加鎖么
多線程訪問資料庫,其中有一個線程會長時間佔用資料庫。這個線程是獨立線程,另外有一個線程池也會訪問資料庫,這個線程池中的線程我用lock鎖住資料庫了,但是由於獨立線程和線程池線程不在同一個方法中,所以訪問資料庫的時間不同,用lock只能對線程池線程有效 回答: 你這么講一定能保證兩個線程不會在一個時刻共同發起對資料庫的訪問么?除非你做了很多同步讓兩個線程都按照你設計的邏輯不發生訪問資料庫的沖突,否則你必須加鎖。看你的說明,你應該沒加同步,所以他會出現沖突,你不能缺鎖,他是共享資源的訪問了
Ⅳ 如何解決多線程造成的資料庫死鎖
多線程是很容易造成死鎖,一般情況下死鎖都是因為並發操作引起的。我不懂JAVA,但死鎖這個問題每種開發工具和資料庫都會碰到.解決辦法是:
1、程序方面優化演算法(如有序資源分配法、銀行演算法等),在一個程序里,能不用多線程更新同一張資料庫表
盡量不要用,如果要用,其避免死鎖的演算法就很復雜。
2、資料庫方面設置等待超時時間
3、發生死鎖後直接KILL掉資料庫進程
Ⅳ SQLite資料庫的多線程鎖模式問題,怎麼解決
多線程是很容易造成死鎖,一般情況下死鎖都是因為並發操作引起的。我不懂JAVA,但死鎖這個問題每種開發工具和資料庫都會碰到.解決辦法是:
1、程序方面優化演算法(如有序資源分配法、銀行演算法等),在一個程序里,能不用多線程更新同一張資料庫表 盡量不要用,如果要用,其避免死鎖的演算法就很復雜。
2、資料庫方面設置等待超時時間
3、發生死鎖後直接KILL掉資料庫進程
Ⅵ 兩個線程/進程 同時 查詢/修改一張mysql資料庫的表 需要加鎖嗎, 還是說mysql自己能處理這種條件競爭
資料庫有自己的連接鎖機制,如果是針對同一台機器使用同一個介面進行插入的話多線程和單線程是一樣的。除非你有好幾台資料庫伺服器,這樣再使用多線程來進行上面的工作的話效率才會明顯提高。
Ⅶ 如何在多線程操作資料庫
通常,最好避免鎖定 public 類型或鎖定不受應用程序控制的對象實例。例如,如果該實例可以被公開訪問,則 lock(this) 可能會有問題,因為不受控制的代碼也可能會鎖定該對象。這可能導致死鎖,即兩個或更多個線程等待釋放同一對象。出於同樣的原因,鎖定公共數據類型(相比於對象)也可能導致問題。鎖定字元串尤其危險,因為字元串被公共語言運行庫 (CLR)「暫留」。這意味著整個程序中任何給定字元串都只有一個實例,就是這同一個對象表示了所有運行的應用程序域的所有線程中的該文本。因此,只要在應用程序進程中的任何位置處具有相同內容的字元串上放置了鎖,就將鎖定應用程序中該字元串的所有實例。因此,最好鎖定不會被暫留的私有或受保護成員。某些類提供專門用於鎖定的成員。例如,Array 類型提供 SyncRoot。許多集合類型也提供 SyncRoot。
Ⅷ 多線程操作資料庫,如何避免沖突除了用lock加鎖以外 還有其他方式嗎
追問: 多線程訪問資料庫,其中有一個線程會長時間佔用資料庫。這個線程是獨立線程,另外有一個線程池也會訪問資料庫,這個線程池中的線程我用lock鎖住資料庫了,但是由於獨立線程和線程池線程不在同一個方法中,所以訪問資料庫的時間不同,用lock只能對線程池線程有效 回答: 你這么講一定能保證兩個線程不會在一個時刻共同發起對資料庫的訪問么?除非你做了很多同步讓兩個線程都按照你設計的邏輯不發生訪問資料庫的沖突,否則你必須加鎖。看你的說明,你應該沒加同步,所以他會出現沖突,你不能缺鎖,他是共享資源的訪問了。 追問: 恩,好的。受教了。
Ⅸ java中多線程的鎖是什麼概念誰能一言以蔽之
一句話:三個和尚打水喝!打個比喻桶就是鎖,拿到桶的人不會渴死,多線程就是你拿一會,我拿一會,線程等待就是一個和尚喝了一會,別的和尚在等,可能能喝到水。死鎖就是三個和尚互相打架,都拽著對方的手誰都喝不到,睡眠就是一個和尚說我可以讓別人先喝,自己去睡會覺去,回來後還得看別人的臉色。
Ⅹ sqlite多線程讀寫需不需自己加鎖
線程訪問資料庫其線程間佔用資料庫線程獨立線程另外線程池訪問資料庫線程池線程我用lock鎖住資料庫由於獨立線程線程池線程同所訪問資料庫間同用lock能線程池線程效 答: 講定能保證兩線程刻共同發起資料庫訪問除非做同步讓兩線程都按照設計邏輯發訪問資料庫沖突否則必須加鎖看說明應該沒加同步所現沖突能缺鎖共享資源訪問