偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

減少Sql server死鎖現(xiàn)象的發(fā)生

數(shù)據(jù)庫 SQL Server
Sql server死鎖是指在某組資源中,兩個或兩個以上的線程在執(zhí)行過程中,在爭奪某一資源時而造成互相等待的現(xiàn)象,下面就讓我們了解一下如何減少Sql server死鎖的方法。

如何減少Sql server死鎖現(xiàn)象呢?這是很多人都提到過的問題,在解決此問題之前,先讓我們了解一下什么是Sql server死鎖。

Sql server死鎖是指在某組資源中,兩個或兩個以上的線程在執(zhí)行過程中,在爭奪某一資源時而造成互相等待的現(xiàn)象,若無外力的作用下,它們都將無法推進(jìn)下去,死時就可能會產(chǎn)生死鎖,這些永遠(yuǎn)在互相等待的進(jìn)程稱為死鎖線程。簡單的說,進(jìn)程A等待進(jìn)程B釋放他的資源,B又等待A釋放他的資源,這樣互相等待就形成死鎖。

如在數(shù)據(jù)庫中,如果需要對一條數(shù)據(jù)進(jìn)行修改,首先數(shù)據(jù)庫管理系統(tǒng)會在上面加鎖,以保證在同一時間只有一個事務(wù)能進(jìn)行修改操作。如事務(wù)1的線程 T1 具有表A上的排它鎖,事務(wù)2的線程T2 具有表B上的排它鎖,并且之后需要表A上的鎖。事務(wù)2無法獲得這一鎖,因為事務(wù)1已擁有它。事務(wù)2被阻塞,等待事務(wù)1。然后,事務(wù)1需要表B的鎖,但無法獲得鎖,因為事務(wù)2將它鎖定了。事務(wù)在提交或回滾之前不能釋放持有的鎖。因為事務(wù)需要對方控制的鎖才能繼續(xù)操作,所以它們不能提交或回滾,這樣數(shù)據(jù)庫就會發(fā)生死鎖了。

如在編寫存儲過程的時候,由于有些存儲過程事務(wù)性的操作比較頻繁,如果先鎖住表A,再鎖住表B,那么在所有的存儲過程中都要按照這個順序來鎖定它們。如果無意中某個存儲過程中先鎖定表B,再鎖定表A,這可能就會導(dǎo)致一個死鎖。而且死鎖一般是不太容易被發(fā)現(xiàn)的。

如果服務(wù)器上經(jīng)常出現(xiàn)這種死鎖情況,就會降低服務(wù)器的性能,所以應(yīng)用程序在使用的時候,我們就需要對其進(jìn)行跟蹤。

我們只需要通過在查詢分析器里面執(zhí)行sp_who_lock,就可以具體捕捉到執(zhí)行的堵塞進(jìn)程,這時我們就可以對對應(yīng)的SQL語句或者存儲過程進(jìn)行性能上面的改進(jìn)及設(shè)計。

所以我們在數(shù)據(jù)庫設(shè)計的時候,雖然不能完全避免死鎖,但可以使死鎖的數(shù)量盡量減少。增加事務(wù)的吞吐量并減少系統(tǒng)開銷,因為只有很少的事務(wù),所以就得遵循下面的原則:

按同一順序訪問對象

如果所有并發(fā)事務(wù)按同一順序訪問對象,則發(fā)生死鎖的可能性會降低。在寫SQL語句或存儲過程的時候,就需要按照順序在兩個并發(fā)事務(wù)中先獲得表A上的鎖,然后獲得表B上的鎖,當(dāng)?shù)谝粋€事務(wù)完成之前,另一個事務(wù)被阻塞在表A上。第一個事務(wù)提交或回滾后,第二個事務(wù)繼續(xù)進(jìn)行,而不能在語句里面寫先獲得表B上的鎖,然后再獲得表A的鎖。

避免事務(wù)中的用戶交互

避免編寫包含用戶交互的事務(wù),因為運行沒有用戶交互的批處理的速度要遠(yuǎn)遠(yuǎn)快于用戶手動響應(yīng)查詢的速度,例如答復(fù)應(yīng)用程序請求參數(shù)的提示。例如,如果事務(wù)正在等待用戶輸入,而用戶就去做別的事了,則用戶將此事務(wù)掛起使之不能完成。這樣將降低系統(tǒng)的吞吐量,因為事務(wù)持有的任何鎖只有在事務(wù)提交或回滾時才會釋放。即使不出現(xiàn)死鎖的情況,訪問同一資源的其它事務(wù)也會被阻塞,等待該事務(wù)完成。

保持事務(wù)簡短并在一個批處理中

在同一數(shù)據(jù)庫中并發(fā)執(zhí)行多個需要長時間運行的事務(wù)時通常發(fā)生死鎖。事務(wù)運行時間越長,其持有排它鎖或更新鎖的時間也就越長,從而堵塞了其它活動并可能導(dǎo)致死鎖。保持事務(wù)在一個批處理中,可以最小化事務(wù)的網(wǎng)絡(luò)通信往返量,減少完成事務(wù)可能的延遲并釋放鎖。

使用低隔離級別

確定事務(wù)是否能在更低的隔離級別上運行。執(zhí)行提交讀允許事務(wù)讀取另一個事務(wù)已讀取(未修改)的數(shù)據(jù),而不必等待第一個事務(wù)完成。使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可串行讀)可以縮短持有共享鎖的時間,從而降低了鎖定爭奪.

使用綁定連接

使用綁定連接使同一應(yīng)用程序所打開的兩個或多個連接可以相互合作。次級連接所獲得的任何鎖可以象由主連接獲得的鎖那樣持有,反之亦然,因此不會相互阻塞。

下面有一些對死鎖發(fā)生的一些建議:

1)對于頻繁使用的表使用集簇化的索引;

2)設(shè)法避免一次性影響大量記錄的T-SQL語句,特別是INSERT和UPDATE語句;

3)設(shè)法讓UPDATE和DELETE語句使用索引;

4)使用嵌套事務(wù)時,避免提交和回退沖突;

5)對一些數(shù)據(jù)不需要及時讀取更新值的表在寫SQL的時候在表后臺加上(nolock),如:Select * from tableA(nolock)
 

 

 

 

【編輯推薦】

SQL Server2008版本和組件

四種SQL Server安全性策略

SQL Server多條件查詢的實現(xiàn)

SQL Server跨服務(wù)器查詢

SQL Server資源鎖模式大全

責(zé)任編輯:段燃 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-04-02 17:08:44

SQL Server死鎖

2011-03-08 09:27:34

SQL Server數(shù)死鎖

2009-03-30 10:56:58

SQL Server數(shù)據(jù)庫死鎖數(shù)據(jù)庫

2010-07-07 13:58:25

SQL Server死

2010-11-09 17:04:20

SQL Server死

2010-07-06 10:08:57

SQL Server

2010-09-14 15:34:29

sql server死

2010-11-09 17:02:43

SQL Server死

2014-03-17 10:34:48

SQL Server

2010-11-09 16:29:39

SQL Server死

2010-11-09 16:20:46

SQL Server死

2023-08-15 08:26:34

SQL Server查找死鎖

2010-06-30 14:15:08

SQL Server死

2010-07-02 10:53:32

SQL Server死

2010-07-20 10:27:57

SQL Server

2010-07-22 10:02:12

SQL Server置

2024-01-22 10:52:45

C++多線程死鎖

2012-08-20 09:45:18

SQL Server

2010-08-26 10:45:33

死鎖SQL Server

2011-02-28 13:19:50

SQL Server SQL死鎖
點贊
收藏

51CTO技術(shù)棧公眾號