中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

知方(fang)可補不足~用SqlProfiler來(lai)監(jian)視數據庫死鎖

回到目錄

關于鎖的相關知識,大家可以看我的這篇文章《知方可補不足~Sqlserver中的幾把鎖和.net中的事務級別

死(si)鎖我想大家都知道,當一(yi)個(ge)(ge)對話(hua)(線(xian)程)占用一(yi)個(ge)(ge)資源時,別一(yi)個(ge)(ge)線(xian)程也同時去訪問它,并(bing)且其(qi)(qi)中一(yi)個(ge)(ge)優化級高的(de)對話(hua)將SQL鎖狀(zhuang)態提升(sheng)為X鎖(排它鎖)后(hou),其(qi)(qi)一(yi)個(ge)(ge)對話(hua)將會(hui)被作為“犧牲品(pin)”拋棄(qi),這種現(xian)象在SQLSERVER中就叫做死(si)鎖,引起死(si)鎖的(de)原因有很多(duo),一(yi)般在網上(shang)被前(qian)人總結(jie)為四(si)點(dian)

1、互斥使用(資源獨占)
 一個資源每次只能給一個進程使用
2、不可強占(不可剝奪)
    資源申請者不能強行的從資源占有者手中奪取資源,資源只能由占有者自愿釋放
3、請求和保持(部分分配,占有申請)
一個進程在申請新的資源的同時保持對原有資源的占有(只有這樣才是動態申請,動態分配)
4、循環等待
存(cun)在一(yi)個進(jin)程等待(dai)隊列     {P1 , P2 , … , Pn},     其中P1等待(dai)P2占有(you)的(de)資源,P2等待(dai)P3占有(you)的(de)資源,…,Pn等待(dai)P1占有(you)的(de)資源,形成(cheng)一(yi)個進(jin)程等待(dai)環路

觀察(cha)鎖的發生,使用(yong)sqlProfiler工具

設置對話(線程,spid)的優先級

SET TRANSACTION ISOLATION LEVEL Read Committed
BEGIN TRAN
SET DEADLOCK_PRIORITY HIGH

對于優先(xian)級,以(yi)以(yi)下選項

 LOW | NORMAL | HIGH

也可以直接使用數字

<numeric-priority> ::= { -10 | -9 | -8 | …| 0 | …| 8 | 9 | 10 }

在(zai)EF里(li),對(dui)發生死(si)鎖的代碼進行重新(xin)提(ti)交(jiao)

在EF架構里(li),倉儲大(da)叔提(ti)倡大(da)家使用自己的SaveChanges方法,其原因(yin)就是可(ke)以(yi)對(dui)提(ti)交動作進(jin)行統(tong)一(yi)的控制(zhi),在里(li)面加日(ri)志,加捕捉,加策略可(ke)以(yi)成(cheng)為可(ke)能,呵呵。

 //下面代碼節(jie)選自大叔的DbContextRepository類
  catch (EntityException ex)//EF配(pei)置異常,這個異常可以忽略(The underlying provider failed on Commit.)
            {
                if (Logger != null)
                    Logger(ex.Message);
                throw new Exception(ex.Message);//EntityException
            }
            catch (Exception ex)//捕獲(huo)所(suo)有異常(chang)
            {

                if (Logger != null)//如(ru)果沒(mei)有(you)定義日志功能,就把異常拋出(chu)來吧(ba)
                    Logger(ex.Message + "處理時間:" + DateTime.Now);
                if (ex.GetBaseException() != null
                    && ex.GetBaseException().GetType() == typeof(System.Data.SqlClient.SqlException))
                {
                    //SqlException異常,再重新進行提交
                    Db.SaveChanges();
                }
                throw new Exception(ex.Message);
            }

回到目錄

posted @ 2015-01-19 16:00  張占嶺  閱讀(1088)  評論(0)    收藏  舉報