❶ DB2鎖方面的sql語句分析
鎖表和mc_mer_trad_incom的更新頻率有關系的
可以在mc_payment_flow,mc_payment_flow表上建索引減少mc_mer_trad_incom的鎖表時間
如果有頻繁的mc_payment_flow,mc_payment_flow表的更新操作可以直接使用X鎖避免NS鎖的升級
可以在select中加入with rs use and keep exclusive locks避免鎖升級
資料庫的參數可調整locktimeout,locklist,maxlocks
❷ 如何減少SQL Server死鎖發生
死鎖是指在某組資源中 兩個或兩個以上的線程在執行過程中 在爭奪某一資源時而造成互相等待的現象 若無外力的作用下 它們都將無法推進下去 死時就可能會產生死鎖 這些永遠在互相等待的進程稱為死鎖線程 簡單的說 進程A等待進程B釋放他的資源 B又等待A釋放他的資源 這樣互相等待就形成死鎖
如在資料庫中 如果需要對一條數據進行修改 首先資料庫管理系統會在上面加鎖 以保證在同一時間只跡扒瞎有一個事務能進行修改操作 如事務 的線程 T 具有表A上的排它鎖 事務 的線程T 具有表B上的排它鎖 並且之後需要表A上的鎖 事務 無法獲得這一鎖 因為事務 已擁有它 事務 被阻塞 等待事務 然後 事務 需要表B的鎖 但無法獲得鎖 因為事務 將它鎖定了 事務在提交或回滾之前不能釋放持有的鎖 因為事務需要對方控制的鎖才能繼續操作 所以它們不能提交或回滾 這樣資料庫就會發生死鎖了
如在編此笑寫存儲過程的時候 由於有些存儲過程事務性姿空的操作比較頻繁 如果先鎖住表A 再鎖住表B 那麼在所有的存儲過程中都要按照這個順序來鎖定它們 如果無意中某個存儲過程中先鎖定表B 再鎖定表A 這可能就會導致一個死鎖 而且死鎖一般是不太容易被發現的
如果伺服器上經常出現這種死鎖情況 就會降低伺服器的性能 所以應用程序在使用的時候 我們就需要對其進行跟蹤 使用sp_who和sp_who 來確定可能是哪些用戶阻塞了其他用戶 我們還可以用下面的存儲過程來跟蹤具體的死鎖執行的影響
create procere sp_who_lock
as
begin
declare @spid int @bl int @intTransactionCountOnEntry
int @intRowcount
int @intCountProperties
int @intCounter
int create table
#tmp_lock_who
(id int identity( ) spid *** allint bl *** allint)IF @@ERROR<> RETURN
@@ERRORinsert into
#tmp_lock_who(spid bl) select
blockedfrom (select * from sysprocesses where
blocked> )
a where not exists(select * from (select * from sysprocesses where blocked> )
b where a blocked=spid)union select spid blocked from sysprocesses where
blocked> IF
@@ERROR<> RETURN @@ERROR 找到臨時表的記錄數select
@intCountProperties = Count(*) @intCounter = from #tmp_lock_whoIF
@@ERROR<> RETURN @@ERROR if @intCountProperties= select
現在沒有阻塞和死鎖信息
as message 循環開始while @intCounter <= @intCountPropertie *** egin 取第一條記錄select
@spid = spid @bl = blfrom #tmp_lock_who where id = @intCounter beginif @spid = select
引起資料庫死鎖的是: + CAST(@bl AS VARCHAR( )) + 進程號
其執行的SQL語法如下 elseselect
進程號SPID + CAST(@spid AS VARCHAR( ))+ 被 +
進程號SPID + CAST(@bl AS VARCHAR( )) + 阻塞
當前進程執行的SQL語法如下 DBCC INPUTBUFFER (@bl )end
循環指針下移set @intCounter = @intCounter + enddrop table #tmp_lock_who
return
我們只需要通過在查詢分析器裡面執行sp_who_lock 就可以具體捕捉到執行的堵塞進程 這時我們就可以對對應的SQL語句或者存儲過程進行性能上面的改進及設計
所以我們在資料庫設計的時候 雖然不能完全避免死鎖 但可以使死鎖的數量盡量減少 增加事務的吞吐量並減少系統開銷 因為只有很少的事務 所以就得遵循下面的原則
按同一順序訪問對象
如果所有並發事務按同一順序訪問對象 則發生死鎖的可能性會降低 在寫SQL語句或存儲過程的時候 就需要按照順序在兩個並發事務中先獲得表A上的鎖 然後獲得表B上的鎖 當第一個事務完成之前 另一個事務被阻塞在表A上 第一個事務提交或回滾後 第二個事務繼續進行 而不能在語句裡面寫先獲得表B上的鎖 然後再獲得表A的鎖
避免事務中的用戶交互
避免編寫包含用戶交互的事務 因為運行沒有用戶交互的批處理的速度要遠遠快於用戶手動響應查詢的速度 例如答復應用程序請求參數的提示 例如 如果事務正在等待用戶輸入 而用戶就去做別的事了 則用戶將此事務掛起使之不能完成 這樣將降低系統的吞吐量 因為事務持有的任何鎖只有在事務提交或回滾時才會釋放 即使不出現死鎖的情況 訪問同一資源的其它事務也會被阻塞 等待該事務完成
保持事務簡短並在一個批處理中
在同一資料庫中並發執行多個需要長時間運行的事務時通常發生死鎖 事務運行時間越長 其持有排它鎖或更新鎖的時間也就越長 從而堵塞了其它活動並可能導致死鎖 保持事務在一個批處理中 可以最小化事務的網路通信往返量 減少完成事務可能的延遲並釋放鎖
使用低隔離級別
確定事務是否能在更低的隔離級別上運行 執行提交讀允許事務讀取另一個事務已讀取(未修改)的數據 而不必等待第一個事務完成 使用較低的隔離級別(例如提交讀)而不使用較高的隔離級別(例如可串列讀)可以縮短持有共享鎖的時間 從而降低了鎖定爭奪
使用綁定連接
使用綁定連接使同一應用程序所打開的兩個或多個連接可以相互合作 次級連接所獲得的任何鎖可以象由主連接獲得的鎖那樣持有 反之亦然 因此不會相互阻塞
下面有一些對死鎖發生的一些建議
)對於頻繁使用的表使用集簇化的索引;
)設法避免一次性影響大量記錄的T SQL語句 特別是INSERT和UPDATE語句;
)設法讓UPDATE和DELETE語句使用索引;
)使用嵌套事務時 避免提交和回退沖突;
lishixin/Article/program/SQLServer/201311/22281
❸ SQL:下面哪個鎖防止你的資料庫鎖死
答案是B,更新鎖!解答如下:
共享鎖
共享 (S) 鎖允許並發事務讀取 (SELECT) 一個資源。資源上存在共享 (S) 鎖時,任何其它事務都不能修改數據。一旦已經讀取數據,便立即釋放資源上的共享 (S) 鎖,除非將事務隔離級別設置為可重復讀或更高級別,或者在事務生存周期內用鎖定提示保留共享 (S) 鎖。
更新鎖
更新 (U) 鎖可以防止通常形式的死鎖。一般更新模式由一個事務組成,此事務讀取記錄,獲取資源(頁或行)的共享 (S) 鎖,然後修改行,此操作要求鎖轉換為排它 (X) 鎖。如果兩個事務獲得了資源上的共享模式鎖,然後試圖同時更新數據,則一個事務嘗試將鎖轉換為排它 (X) 鎖。共享模式到排它鎖的轉換必須等待一段時間,因為一個事務的排它鎖與其它事務的共享模式鎖不兼容;發生鎖等待。第二個事務試圖獲取排它 (X) 鎖以進行更新。由於兩個事務都要轉換為排它 (X) 鎖,並且每個事務都等待另一個事務釋放共享模式鎖,因此發生死鎖。
若要避免這種潛在的死鎖問題,請使用更新 (U) 鎖。一次只有一個事務可以獲得資源的更新 (U) 鎖。如果事務修改資源,則更新 (U) 鎖轉換為排它 (X) 鎖。否則,鎖轉換為共享鎖。
排它鎖
排它 (X) 鎖可以防止並發事務對資源進行訪問。其它事務不能讀取或修改排它 (X) 鎖鎖定的數據。
意向鎖
意向鎖表示 SQL Server 需要在層次結構中的某些底層資源上獲取共享 (S) 鎖或排它 (X) 鎖。例如,放置在表級的共享意向鎖表示事務打算在表中的頁或行上放置共享 (S) 鎖。在表級設置意向鎖可防止另一個事務隨後在包含那一頁的表上獲取排它 (X) 鎖。意向鎖可以提高性能,因為 SQL Server 僅在表級檢查意向鎖來確定事務是否可以安全地獲取該表上的鎖。而無須檢查表中的每行或每頁上的鎖以確定事務是否可以鎖定整個表。
意向鎖包括意向共享 (IS)、意向排它 (IX) 以及與意向排它共享 (SIX)。
❹ SQL里某表經常鎖表怎麼解決
你檢查下應用或者其他(如SP等等)對該表是否有長時間佔用或者執行效率低,導致鎖表。
❺ 資料庫鎖表是什麼意思
1、資料庫鎖表的意思:因為在資料庫里,同一個數據可能有多個人來讀取或更改,為了防止我更改的時候別人也同時更改,這是一般要鎖住表不讓別人改。
2、舉個簡單例子:在更新資料庫記錄的過程中,我是不希望別人也來更新我的這些記錄的,像庫存,做出庫的時候,原數量100,我出了20,我就需要把數量更新到80;
在更新的過程中,別人又做了30的出庫,如果在我更新的時候,別人先把庫存更新到70,然後我又更新80,那數量就錯誤了。所以我更新的時候,我就需要鎖定這條記錄。這是數據行鎖,排他鎖。
(5)sql防止視圖鎖表擴展閱讀:
資料庫鎖表的必要條件:
1)互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。如果此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。
2)請求和保持條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。
3)不剝奪條件:指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。
4)環路等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。