當前位置:首頁 » 數據倉庫 » 資料庫經常出現死鎖
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫經常出現死鎖

發布時間: 2022-10-24 02:32:25

sql資料庫總是假死或死鎖。

建議:
1、使用事件探查器,跟蹤一下SQL在死鎖之前執行了哪些SQL語句
2、多數死鎖是因為程序沒有經過嚴格的測試造成的
3、少部分原因是因為觸發器嵌套造成的,SQL有內部機制,當嵌套到一定的層級,就自動終止掉相關的進程
願早日解決問題

❷ 資料庫死鎖一般都什麼原因導致的

一般情況只發生鎖超時,就是一個進程需要訪問資料庫表或者欄位的時候,另外一個程序正在執行帶鎖的訪問(比如修改數據),那麼這個進程就會等待,當等了很久鎖還沒有解除的話就會鎖超時,報告一個系統錯誤,拒絕執行相應的SQL操作。
發生死鎖的情況比較少,比如一個進程需要訪問兩個資源(資料庫表或者欄位),當獲取一個資源的時候進程就對它執行鎖定,然後等待下一個資源空閑,這時候如果另外一個進程也需要兩個資源,而已經獲得並鎖定了第二個資源,那麼就會死鎖,因為當前進程鎖定第一個資源等待第二個資源,而另外一個進程鎖定了第二個資源等待第一個資源,兩個進程都永遠得不到滿足。

❸ 死鎖怎麼回事

一、活鎖
如果事務T1封鎖了數據R,事務T2又請求封鎖R,於是T2等待。T3也請求封鎖R,當T1釋放了R上的封鎖之後系統首先批准了T3的請求,T2仍然等待。然後T4又請求封鎖R,當T3釋放了R上的封鎖之後系統又批准了T4的請求,...,T2有可能永遠等待,這就是活鎖的情形,如圖8.4(a)所示。
避免活鎖的簡單方法是採用先來先服務的策略。
二、死鎖
如果事務T1封鎖了數據R1,T2封鎖了數據R2,然後T1又請求封鎖R2,因T2已封鎖了R2,於是T1等待T2釋放R2上的鎖。接著T2又申請封鎖R1,因T1已封鎖了R1,T2也只能等待T1釋放R1上的鎖。這樣就出現了T1在等待T2,而T2又在等待T1的局面,T1和T2兩個事務永遠不能結束,形成死鎖。
1.
死鎖的預防
在資料庫中,產生死鎖的原因是兩個或多個事務都已封鎖了一些數據對象,然後又都請求對已為其他事務封鎖的數據對象加鎖,從而出現死等待。防止死鎖的發生其實就是要破壞產生死鎖的條件。預防死鎖通常有兩種方法:

一次封鎖法
一次封鎖法要求每個事務必須一次將所有要使用的數據全部加鎖,否則就不能繼續執行。
一次封鎖法雖然可以有效地防止死鎖的發生,但也存在問題,一次就將以後要用到的全部數據加鎖,勢必擴大了封鎖的范圍,從而降低了系統的並發度。

順序封鎖法
順序封鎖法是預先對數據對象規定一個封鎖順序,所有事務都按這個順序實行封鎖。
順序封鎖法可以有效地防止死鎖,但也同樣存在問題。事務的封鎖請求可以隨著事務的執行而動態地決定,很難事先確定每一個事務要封鎖哪些對象,因此也就很難按規定的順序去施加封鎖。
可見,在操作系統中廣為採用的預防死鎖的策略並不很適合資料庫的特點,因此DBMS在解決死鎖的問題上普遍採用的是診斷並解除死鎖的方法。
2.
死鎖的診斷與解除

超時法
如果一個事務的等待時間超過了規定的時限,就認為發生了死鎖。超時法實現簡單,但其不足也很明顯。一是有可能誤判死鎖,事務因為其他原因使等待時間超過時限,系統會誤認為發生了死鎖。二是時限若設置得太長,死鎖發生後不能及時發現。

等待圖法
事務等待圖是一個有向圖G=(T,U)。
T為結點的集合,每個結點表示正運行的事務;U為邊的集合,每條邊表示事務等待的情況。若T1等待T2,則T1、T2之間劃一條有向邊,從T1指向T2。事務等待圖動態地反映了所有事務的等待情況。並發控制子系統周期性地(比如每隔1分鍾)檢測事務等待圖,如果發現圖中存在迴路,則表示系統中出現了死鎖。
DBMS的並發控制子系統一旦檢測到系統中存在死鎖,就要設法解除。通常採用的方法是選擇一個處理死鎖代價最小的事務,將其撤消,釋放此事務持有的所有的鎖,使其它事務得以繼續運行下去。當然,對撤消的事務所執行的數據修改操作必須加以恢復。

❹ 資料庫死鎖的基本解釋

每個使用關系型資料庫的程序都可能遇到數據死鎖
的情況。理解什麼是死鎖之前先要了解鎖定的概念:
多數情況下,可以認為如果一個資源被鎖定,它總會在以後某個時間被釋放。而死鎖發生在當多個進程訪問同一資料庫時,其中每個進程擁有的鎖都是其他進程所需的,由此造成每個進程都無法繼續下去。簡單的說,進程A等待進程B釋放他的資源,B又等待A釋放他的資源,這樣就互相等待就形成死鎖。

❺ 資料庫中死鎖是什麼產生的

資料庫操作的死鎖是不可避免的,本文並不打算討論死鎖如何產生,重點在於解決死鎖,通過SQL Server 2005, 現在似乎有了一種新的解決辦法。

將下面的SQL語句放在兩個不同的連接裡面,並且在5秒內同時執行,將會發生死鎖。

use Northwind
begin tran
insert into Orders(CustomerId) values(@#ALFKI@#)
waitfor delay @#00:00:05@#
select * from Orders where CustomerId = @#ALFKI@#
commit
print @#end tran@#

SQL Server對付死鎖的辦法是犧牲掉其中的一個,拋出異常,並且回滾事務。在SQL Server 2000,語句一旦發生異常,T-SQL將不會繼續運行,上面被犧牲的連接中, print @#end tran@#語句將不會被運行,所以我們很難在SQL Server 2000的T-SQL中對死鎖進行進一步的處理。

現在不同了,SQL Server 2005可以在T-SQL中對異常進行捕獲,這樣就給我們提供了一條處理死鎖的途徑:

下面利用的try ... catch來解決死鎖。

SET XACT_ABORT ON
declare @r int
set @r = 1
while @r <= 3
begin
begin tran

begin try
insert into Orders(CustomerId) values(@#ALFKI@#)
waitfor delay @#00:00:05@#
select * from Orders where CustomerId = @#ALFKI@#

commit
break
end try

begin catch
rollback
waitfor delay @#00:00:03@#
set @r = @r + 1
continue
end catch
end

解決方法當然就是重試,但捕獲錯誤是前提。rollback後面的waitfor不可少,發生沖突後需要等待一段時間,@retry數目可以調整以應付不同的要求。

但是現在又面臨一個新的問題: 錯誤被掩蓋了,一但問題發生並且超過3次,異常卻不會被拋出。SQL Server 2005 有一個RaiseError語句,可以拋出異常,但卻不能直接拋出原來的異常,所以需要重新定義發生的錯誤,現在,解決方案變成了這樣:

declare @r int
set @r = 1
while @r <= 3
begin
begin tran

begin try
insert into Orders(CustomerId) values(@#ALFKI@#)
waitfor delay @#00:00:05@#
select * from Orders where CustomerId = @#ALFKI@#

commit
break
end try

begin catch
rollback
waitfor delay @#00:00:03@#
set @r = @r + 1
continue
end catch
end
if ERROR_NUMBER() <> 0
begin
declare @ErrorMessage nvarchar(4000);
declare @ErrorSeverity int;
declare @ErrorState int;
select
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
raiserror (@ErrorMessage,
@ErrorSeverity,
@ErrorState
);
end

❻ 在資料庫中解決死鎖的常用方法有哪些

1、要求每個事務一次就將所有要使用的數據全部加鎖,否則不能執行。
2、採用按序加鎖法.預先規定一個封鎖順序,所有的事務都必須按這個順序對數據執行封鎖。
3、不採取任何措施來預防死鎖的發生,而是周期性地檢查系統中是否有死鎖.如果發現死鎖就設法解除。

❼ 資料庫查詢發生死鎖

導致
死鎖
的主要原因是
SQL語句
里有for
update
導致。比如當你訪問這個表時候
有人使用了for
update進行
數據修改
,那在你那裡調試也好執行也好
都會導致無法返回結果
一直卡在那裡。

❽ 資料庫死鎖處理方法

mysql資料庫死鎖解決方法如下:

1、對於按鈕等控制項,點擊後使其立刻失效,不讓用戶重復點擊,避免對同時對同一條記錄操作。

2、使用樂觀鎖進行控制。樂觀鎖大多是基於數據版本(Version)記錄機制實現。即為數據增加一個版本標識,在基於資料庫表的版本解決方案中,一般是 通過為資料庫表增加一個「version」欄位來實現。讀取出數據時,將此版本號一同讀出,之後更新時,對此版本號加一。此時,將提交數據的版本數據與數 據庫表對應記錄的當前版本信息進行比對,如果提交的數據版本號大於資料庫表當前版本號,則予以更新,否則認為是過期數據。樂觀鎖機制避免了長事務中的數據 庫加鎖開銷(用戶A和用戶B操作過程中,都沒有對資料庫數據加鎖),大大提升了大並發量下的系統整體性能表現。Hibernate 在其數據訪問引擎中內置了樂觀鎖實現。需要注意的是,由於樂觀鎖機制是在系統中實現,來自外部系統的用戶更新操作不受系統的控制,因此可能會造 成臟數據被更新到資料庫中。