《軟體開發效能優化系列》之死鎖

2022-04-09 23:59:02 字數 734 閱讀 8088

死鎖是由兩個相互阻塞的執行緒組成,它們互相等待對方完成,一般死鎖情況下兩個資料庫事務之間存在著相反的操作。sqlserver中死鎖監視器定時檢查死鎖,如果發現死鎖,將選擇其中回滾消耗最小的任務,這時候發生1025資料庫錯誤。可以通過啟用sqlserver2005快照模式,避免一些讀/寫的逆向阻塞造成的死鎖.但是對於一些寫/寫阻塞的死鎖可能無法解決,很多時候需要從業務的角度來避免一些寫/寫的逆向操作阻塞情況。

死鎖問題的解決很困難,但是可以通過一些手段來使死鎖最小化。

從理論上講,資料庫死鎖無法避免,但是可以遵循一定原則使死鎖發生的概率盡量降低。

*用相同的順序訪問物件,如果涉及到多於一張表的操作,要保證事務中都按照相同的順序訪問這些表。

*減少乙個事務中的大批量更新的操作,大批量操作寫操作涉及記錄獨佔鎖太多而且一直到事務結束才能釋放,更容易與其它事務造成死鎖。

*去掉讀操作的共享鎖

最佳方式是使用sql2005的快照模式,其次方式是使用讀未提交隔離模式或使用nolock提示,需要平台和業務設計時依據情況進行sql組織的設計。

按照相同的順序訪問物件可以避免相互持有對方請求資源的情況發生。例如乙個操作主從表的處理流程,涉及查詢和修改兩個步驟。如果查詢時是先查主表再查從表,則修改也應先修改主表再修改從表。

另乙個降低事務大小的乙個主要手段,是將查詢操作盡可能地提前(包括使用一些中間變數記錄下查詢結果提供後續使用),而把插入、修改等操作集中在方法靠後的部分。這樣,可以讓乙個事務需要持有獨佔鎖的時間盡可能縮短,減少死鎖的發生概率。

《軟體開發效能優化系列》之Sql效能優化 一

對於一般簡單查詢,資料庫能自動引數啊以重用計畫快取,如 select from table where id 1 select from table where id 4 在sqlserver內部能自動引數化這個查詢,select from table where id 1 但是一旦sql語句中帶有...

《軟體開發效能優化系列》之String操作

string是不變類,使用 操作連線字串會導致建立乙個新的字串。如果字串連線次數不是固定的,例如在乙個迴圈操作中,則應該使用stringbuilder類來做字串連線工作。因為stringbuilder內部有乙個stringbuffer,連線字元操作不會每次分配新的字串空間。只有當連線後的字串超出bu...

《軟體開發效能優化系列》之型別系統

clr保證所有物件在訪問前已初始化,其做法是將分配的記憶體清零。因此,不需要將變數重新初始化為0 false或null。需要注意的是 方法中的區域性變數不是從堆而是從棧上分配,所以c 不會做清零工作。如果使用了未賦值的區域性變數,編譯期間即會報警。不要因為有這個印象而對所有類的成員變數也做賦值動作,...