㈠ 採用多線程對資料庫讀寫引發沖突
我只說oracle的吧,insert的時候一般是會加行級寫鎖,一般不會升級到表級鎖,多個線程之間處理的數據是否存在搶佔了呢?如果是單純的insert into 不同的信息是不會沖突的
㈡ java多線程同時對資料庫插入
方法加同步鎖,保證在同一個時間內只有一個人可以使用可以解決,具體可以參照http://www.blogjava.net/tscfengkui/archive/2010/11/10/337709.html?opt=admin 這個例子
㈢ sqlite資料庫的多線程鎖模式問題,怎麼解決
多線程是很容易造成死鎖,一般情況下死鎖都是因為並發操作引起的。我不懂JAVA,但死鎖這個問題每種開發工具和資料庫都會碰到.解決辦法是:
1、程序方面優化演算法(如有序資源分配法、銀行演算法等),在一個程序里,能不用多線程更新同一張資料庫表 盡量不要用,如果要用,其避免死鎖的演算法就很復雜。
2、資料庫方面設置等待超時時間
3、發生死鎖後直接KILL掉資料庫進程
㈣ python多線程訪問資料庫,應該怎麼使用
連接對象可以是同一個,指針不能是同一個。
假設conn是你的連接對象
每個線程使用cur=conn.cursor()來獲得指針。
如果有鎖操作的話,有可能產生等待。這個是資料庫級別要處理的問題。看你具體業務吧,比如你需要原子操作,連續寫,中間不能斷的,那你得注意使用事務,或者自己在寫的時候鎖表。這些問題自己搭一個環境一測便知。
㈤ C# 多線程同時執行一條查詢SQL 有一些線程會查不到結果
當我們在程序中運用到多線程的時候,那麼你必須要考慮的就是各線程搶占資源的問題,不能讓同一時間多個線程去搶一個資源,比如你兩個線程同時去操作sql,就會造成有臟讀數據或者查不到數據,或者查的是臟數據,那麼避免這個的辦法可以從兩邊入手,C#程序里加入lock代碼斷,在裡面執行查詢sql,這樣的話在再一時間,就不會有多個線程同時去執行sql,還可以在資料庫中建立一些鎖,執行的時候可將鎖鎖住,但對資料庫加鎖請小心 加鎖和解鎖,否則會鎖死資料庫造成系統崩潰都是有可能 的!
㈥ 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虛擬機無關的操作。最重要的是,多線程設計雖然是困難的,但在開始編程之前詳細設計系統能夠幫助你避免難以發現死鎖的問題。死鎖在語言層面上不能解決,就需要一個良好設計來避免死鎖。
㈦ 我用MFC寫了個多線程的小程序,要共享同一個資料庫,但是會報錯。資料庫連接方面的,請問怎麼解決
定義一個全局的互斥事件CMunex cMunex;
當你在一個線程里要連接資料庫的時候可以這樣:cMunex.lock();
處理完以後可以這樣 :cMunex.unlock();
這樣就OK了。應該可以解決問題了
㈧ 問個SQL問題,oracle資料庫,多線程查詢SQL,防止查到同一條記錄
可以用rownum來查詢一條記錄。
如emp表中有如下數據。
要求查詢deptno為20的,但只取一條記錄,可用如下語句:
select * from emp where deptno=20 and rownum<=1;
查詢結果:
㈨ 如何解決多線程造成的資料庫死鎖
多線程是很容易造成死鎖,一般情況下死鎖都是因為並發操作引起的。我不懂JAVA,但死鎖這個問題每種開發工具和資料庫都會碰到.解決辦法是:
1、程序方面優化演算法(如有序資源分配法、銀行演算法等),在一個程序里,能不用多線程更新同一張資料庫表
盡量不要用,如果要用,其避免死鎖的演算法就很復雜。
2、資料庫方面設置等待超時時間
3、發生死鎖後直接KILL掉資料庫進程