當前位置:首頁 » 操作系統 » 資料庫死鎖

資料庫死鎖

發布時間: 2022-01-09 01:38:50

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

資料庫操作的死鎖是不可避免的,本文並不打算討論死鎖如何產生,重點在於解決死鎖,通過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

② SQL資料庫表的死鎖問題

死鎖的原因可能有多個。
可能第一個人更新的時候,第二個人嘗試讀取,第二個人就卡住了。
假如第一個人更新了,還沒提交,又去檢索一些別的數據,這些數據又是被第三個人鎖定的...

SQL Server 多用戶之間鎖的處理
http://hi..com/wangqing999/blog/item/245768d895cf84b0cc11662b.html
上面這個帖子演示一個 多用戶數據鎖定 / 死鎖 的例子.

C# 多線程處理 IV 線程安全
http://hi..com/wangqing999/blog/item/6c40f05df135e83a2834f0fc.html
這個帖子,提供一個 C# 中,如果通過同步處理, 確保某個 資源,在一個時間點上,只有一個用戶可以使用的例子。

③ 資料庫死鎖怎麼處理

可以用 sp_who 'active' 看一下午 blk 欄位是否為 0 ,如是其它數x,說明這個數可能就是鎖,再用 sp_who 數x 看一下它下面的 blk 是否有數,這樣查下去,如果它下面沒有數並且是查詢狀態或是等待狀態等(除更新及插入狀態)都可以用 kill 數x

④ 怎麼查看資料庫死鎖,和解決方法

exec sp_lock 快捷鍵 C_2
exec sp_who active exec sp_who快捷鍵 C_1
用Profiler裡面的Locks->Deadlock graph 監控看看,如果看到了死鎖圖,就可以比較形象地展現死鎖發生的過程,還可以看到鎖的具體類型和過程裡面的語句,對你診斷會有幫助。

Declare @LockTab table( spid int,dbid int ,ObjId int,IndId int ,Type varchar(50),Resource varchar(50),Mode varchar(50),Status varchar(50))
insert into @LockTab exec sp_lock
Declare @ActiveTab table(spid int,ecid int,status varchar(50),loginname varchar(50),hostname varchar(50),blk int,dbname varchar(50),cmd varchar(50),request_id int)
insert into @ActiveTab exec sp_who active
select * from @LockTab lt
left join @ActiveTab at on lt.spid=at.spid

⑤ 資料庫死鎖,怎樣解決

^_^什麼資料庫啊oracle的就用樓上的就可以了很詳細不過要用sysdba這個許可權級別的用戶才可以的,其他的還真不知道呢

⑥ oracle資料庫死鎖怎麼解決

Oracle資料庫出現死鎖的時候可以按照以下處理步驟加以解決:

第一步:嘗試在sqlplus中通過sql命令進行刪除,如果能夠刪除成功,則萬事大吉!但通常情況下,出現死鎖時,想通過命令行或者通過Oracle的管理工具刪除有死鎖的session,oracle只會將該session標記為killed,但無法清除掉,往往需要通過第二步在操作系統層級進行刪除!

.2.0.1.0
Connectedasquik
SQL>selectxisn,object_id,session_id,locked_modefromv$locked_object;--查死鎖的對象,獲取其SESSION_ID
XIDUSNOBJECT_IDSESSION_IDLOCKED_MODE
-----------------------------------------
1030724293
1030649293
SQL>selectusername,sid,serial#fromv$sessionwheresid=29;--根據上步獲取到的sid查看其serial#號
USERNAMESIDSERIAL#
--------------------------------------------------
QUIK2957107
SQL>altersystemkillsession'29,57107';--刪除進程,如已經刪除過,則會報ora-00031的錯誤;否則oracle會將該session標記為killed狀態,等待一段時間看能否會自動消失,如長時間消失不掉,則需要做後續步驟
altersystemkillsession'29,57107'
ORA-00031:sessionmarkedforkill
SQL>selectpro.spidfromv$sessionses,v$processprowhereses.sid=29andses.paddr=pro.addr;--查看spid號,以便在操作系統中根據該進程號刪除進程
SPID
------------
2273286

第二步:進入操作系統進行刪除進程,本示例的操作系統是IBM aix。

login:root--錄入用戶名
root'sPassword:--錄入密碼
*******************************************************************************
**
**
*WelcometoAIXVersion5.3!*
**
**
*PleaseseetheREADMEfilein/usr/lpp/bosforinformationpertinentto*
*.*
**
**
*******************************************************************************
Lastunsuccessfullogin:FriApr2314:42:57BEIDT2010on/dev/pts/1from10.73
.52.254
Lastlogin:FriApr2315:27:50BEIDT2010on/dev/pts/2from10.73.52.254
#ps-ef|grep2273286--查看進程詳情
root22898642494636017:07:15pts/10:00grep2273286
oracle22732861014:38:24-0:21oracleQUIK(LOCAL=NO)
#kill-92273286--刪除進程,小心操作,別寫錯進程號,如果oracle的關鍵進程被刪,資料庫會崩潰的!
#ps-ef|grep2273286--再次查看
root22898642494636017:07:15pts/10:00grep2273286
ForWindows,attheDOSPrompt:orakillsidspid
ForUNIXatthecommandline>kill–9spid

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

簡單講:比如,在同一表中,你在編輯A記錄,我訪問和修改B記錄,此時兩個記錄都被鎖定。
然後,在同一時時,您要釋放A記錄,進入編輯B記錄,而我要釋放B記錄進入編輯A記錄。
這樣,死鎖就形成了。您不能進入被我鎖定的B記錄,從而繼續停留在A記錄。我不能進入正被您鎖定的A記錄,從而繼續留在B記錄。互相等待對方釋放鎖定的記錄,而不能釋放自已所在的記錄,從而無限期等待。

⑧ 資料庫為什麼總是產生死鎖

多線程是很容易造成死鎖,一般情況下死鎖都是因為並發操作引起的。我不懂JAVA,但死鎖這個問題每種開發工具和資料庫都會碰到.解決辦法是:
1、程序方面優化演算法(如有序資源分配法、銀行演算法等),在一個程序里,能不用多線程更新同一張資料庫表 盡量不要用,如果要用,其避免死鎖的演算法就很復雜。
2、資料庫方面設置等待超時時間
3、發生死鎖後直接KILL掉資料庫進程

⑨ 資料庫死鎖處理方法

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

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

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

熱點內容
海康威視存儲卡質量如何 發布:2024-09-19 08:55:35 瀏覽:939
python3默認安裝路徑 發布:2024-09-19 08:50:22 瀏覽:516
環衛視頻拍攝腳本 發布:2024-09-19 08:35:44 瀏覽:418
sqlserveronlinux 發布:2024-09-19 08:16:54 瀏覽:256
編程常數 發布:2024-09-19 08:06:36 瀏覽:952
甘肅高性能邊緣計算伺服器雲空間 發布:2024-09-19 08:06:26 瀏覽:162
win7家庭版ftp 發布:2024-09-19 07:59:06 瀏覽:717
資料庫的優化都有哪些方法 發布:2024-09-19 07:44:43 瀏覽:269
知乎華為編譯器有用嗎 發布:2024-09-19 07:32:20 瀏覽:618
訪問虛擬機磁碟 發布:2024-09-19 07:28:13 瀏覽:670