什么是數(shù)據(jù)庫死鎖 數(shù)據(jù)庫中死鎖是什么產(chǎn)生的?
數(shù)據(jù)庫中死鎖是什么產(chǎn)生的?數(shù)據(jù)庫操作的死鎖是不可避免的,本文并不打算討論死鎖如何產(chǎn)生,重點(diǎn)在于解決死鎖,通過SQL Server 2005, 現(xiàn)在似乎有了一種新的解決辦法。 將下面的SQL語句放在兩個(gè)
數(shù)據(jù)庫中死鎖是什么產(chǎn)生的?
數(shù)據(jù)庫操作的死鎖是不可避免的,本文并不打算討論死鎖如何產(chǎn)生,重點(diǎn)在于解決死鎖,通過SQL Server 2005, 現(xiàn)在似乎有了一種新的解決辦法。 將下面的SQL語句放在兩個(gè)不同的連接里面,并且在5秒內(nèi)同時(shí)執(zhí)行,將會(huì)發(fā)生死鎖。 use Northwindbegin tran insert into Orders(CustomerId) values(@#ALFKI@#) waitfor delay @#00:00:05@# select * from Orders where CustomerId = @#ALFKI@#commitprint @#end tran@# SQL Server對(duì)付死鎖的辦法是犧牲掉其中的一個(gè),拋出異常,并且回滾事務(wù)。在SQL Server 2000,語句一旦發(fā)生異常,T-SQL將不會(huì)繼續(xù)運(yùn)行,上面被犧牲的連接中, print @#end tran@#語句將不會(huì)被運(yùn)行,所以我們很難在SQL Server 2000的T-SQL中對(duì)死鎖進(jìn)行進(jìn)一步的處理。 現(xiàn)在不同了,SQL Server 2005可以在T-SQL中對(duì)異常進(jìn)行捕獲,這樣就給我們提供了一條處理死鎖的途徑: 下面利用的try ... catch來解決死鎖。 SET XACT_ABORT ONdeclare @r intset @r = 1while @r 0begin 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