資料庫系統中的鎖
⑴ 資料庫中死鎖是什麼產生的
資料庫操作的死鎖是不可避免的,本文並不打算討論死鎖如何產生,重點在於解決死鎖,通過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、舉個簡單例子:在更新資料庫記錄的過程中,我是不希望別人也來更新我的這些記錄的,像庫存,做出庫的時候,原數量100,我出了20,我就需要把數量更新到80;
在更新的過程中,別人又做了30的出庫,如果在我更新的時候,別人先把庫存更新到70,然後我又更新80,那數量就錯誤了。所以我更新的時候,我就需要鎖定這條記錄。這是數據行鎖,排他鎖。
(2)資料庫系統中的鎖擴展閱讀:
資料庫鎖表的必要條件:
1)互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。如果此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。
2)請求和保持條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。
3)不剝奪條件:指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
4)環路等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。
⑶ 「sql」加鎖機制是什麼
您好!鎖是資料庫中的一個非常重要的概念,它主要用於多用戶環境下保證資料庫完整性和一致性。x0dx0a 我們知道,多個用戶能夠同時操縱同一個資料庫中的數據,會發生數據不一致現象。即如果沒有鎖定且多個用戶同時訪問一個資料庫,則當他們的事務同時使用相同的數據時可能會發生問題。這些問題包括:丟失更新、臟讀、不可重復讀和幻覺讀。資料庫加鎖就是為了解決以上的問題。x0dx0a 當然,加鎖固然好,但是一定要避免死鎖的出現。x0dx0a 在資料庫系統中,死鎖是指多個用戶(進程)分別鎖定了一個資源,並又試圖請求鎖定對方已經鎖定的資源,這就產生了一個鎖定請求環,導致多個用戶(進程)都處於等待對方釋放所鎖定資源的狀態。這種死鎖是最典型的死鎖形式, 例如在同一時間內有兩個事務A和B,事務A有兩個操作:鎖定表part和請求訪問表supplier;事務B也有兩個操作:鎖定表supplier和請求訪問表part。結果,事務A和事務B之間發生了死鎖。死鎖的第二種情況是,當在一個資料庫中時,有若干個長時間運行的事務執行並行的操作,當查詢分析器處理一種非常復雜的查詢例如連接查詢時,那麼由於不能控制處理的順序,有可能發生死鎖現象。x0dx0a 在應用程序中就可以採用下面的一些方法來盡量避免死鎖了: (1)合理安排表訪問順序。 (2)在事務中盡量避免用戶干預,盡量使一個事務處理的任務少些, 保持事務簡短並在一個批處理中。 (3)數據訪問時域離散法, 數據訪問時域離散法是指在客戶機/伺服器結構中,採取各種控制手段控制對資料庫或資料庫中的對象訪問時間段。主要通過以下方式實現: 合理安排後台事務的執行時間,採用工作流對後台事務進行統一管理。工作流在管理任務時,一方面限制同一類任務的線程數(往往限制為1個),防止資源過多佔用; 另一方面合理安排不同任務執行時序、時間,盡量避免多個後台任務同時執行,另外, 避免在前台交易高峰時間運行後台任務。 (4)數據存儲空間離散法。數據存儲空間離散法是指採取各種手段,將邏輯上在一個表中的數據分散到若干離散的空間上去,以便改善對表的訪問性能。主要通過以下方法實現: 第一,將大表按行或列分解為若干小表; 第二,按不同的用戶群分解。 (5)使用盡可能低的隔離性級別。隔離性級別是指為保證資料庫數據的完整性和一致性而使多用戶事務隔離的程度,SQL92定義了4種隔離性級別:未提交讀、提交讀、可重復讀和可串列。如果選擇過高的隔離性級別,如可串列,雖然系統可以因實現更好隔離性而更大程度上保證數據的完整性和一致性,但各事務間沖突而死鎖的機會大大增加,大大影響了系統性能。 (6)使用綁定連接, 綁定連接允許兩個或多個事務連接共享事務和鎖,而且任何一個事務連接要申請鎖如同另外一個事務要申請鎖一樣,因此可以允許這些事務共享數據而不會有加鎖的沖突。 x0dx0a 總之,了解SQL Server的鎖機制,掌握資料庫鎖定方法, 對一個合格的DBA來說是很重要的。
⑷ 怎麼理解資料庫的鎖 一般鎖分別哪幾種
資料庫是一個多用戶使用的共享資源。當多個用戶並發地存取數據時,在資料庫中就會產生多個事務同時存取同一數據的情況。若對並發操作不加控制就可能會讀取和存儲不正確的數據,破壞資料庫的一致性。
加鎖是實現資料庫並發控制的一個非常重要的技術。當事務在對某個數據對象進行操作前,先向系統發出請求,對其加鎖。加鎖後事務就對該數據對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此數據對象進行更新操作。
在資料庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當數據對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的數據對象可以被其他事務讀取,但不能修改。資料庫利用這兩種基本的鎖類型來對資料庫的事務進行並發控制。
(4)資料庫系統中的鎖擴展閱讀:
排它鎖和共享鎖的不同之處:
1、共享鎖(S鎖):如果事務T對數據A加上共享鎖後,則其他事務只能對A再加共享鎖,不能加排他鎖。獲准共享鎖的事務只能讀數據,不能修改數據。
排他鎖(X鎖):如果事務T對數據A加上排他鎖後,則其他事務不能再對A加任任何類型的封鎖。獲准排他鎖的事務既能讀數據,又能修改數據。
2、共享鎖下其它用戶可以並發讀取,查詢數據。但不能修改,增加,刪除數據,資源共享。
3、共享鎖又稱為讀鎖(Share lock,簡記為S鎖),若事務T對數據對象A加上S鎖,則其它事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。
⑸ 資料庫系統中,死鎖屬於
事務故障。死鎖指的是兩個或更多的事務同時處於等待狀態,每個事務都在等待事務釋放鎖使其可繼續執行,事務故障是事務沒有按預期的要求成功完成,產生的原因是邏輯錯誤或系統錯誤。