自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

動(dòng)手實(shí)戰(zhàn)SQL Server死鎖

數(shù)據(jù)庫(kù) SQL Server 數(shù)據(jù)庫(kù)運(yùn)維
最近的一個(gè)項(xiàng)目由于客戶(hù)明確提出要做下性能壓力測(cè)試,使用的工具就是VS自帶的壓力測(cè)試工具。以前其它項(xiàng)目做壓力測(cè)試后反饋的其中一個(gè)重要問(wèn)題就是數(shù)據(jù)庫(kù)的死鎖。沒(méi)想到我們這個(gè)項(xiàng)目測(cè)試時(shí)死鎖同樣的發(fā)生了,我之前的項(xiàng)目由于很少參與壓力測(cè)試,基本上也不會(huì)去了解死鎖,以及死鎖如何解決的問(wèn)題。

既然有了這個(gè)需求,那么要想解決死鎖就需要對(duì)死鎖的相關(guān)知識(shí)有一定的了解,對(duì)于非DBA的來(lái)講并不需要了解的特別深,知道基本概念以及常見(jiàn)分析方法即可,畢竟我們不靠這個(gè)吃飯,沒(méi)必要達(dá)到特別細(xì)的境界。這里我找到了一個(gè)微軟MVP寫(xiě)的一系統(tǒng)博客,對(duì)我理解死鎖非常重要,這里分享下目前我為解決死鎖所采用過(guò)的方案。

壓力測(cè)試的業(yè)務(wù)場(chǎng)景:

     1.模擬用戶(hù)提交申請(qǐng)

         a)  涉及到的表

              i. 申請(qǐng)主表,一次申請(qǐng)生成一條數(shù)據(jù)。

              ii. 申請(qǐng)的醫(yī)生明細(xì),一次申請(qǐng)包含多個(gè)醫(yī)生,一個(gè)申請(qǐng)包含100個(gè)醫(yī)生

              iii. 單個(gè)醫(yī)生明細(xì),每個(gè)醫(yī)生一條明細(xì)數(shù)據(jù)

              綜上所述一條申請(qǐng)的創(chuàng)建,需要插入201條數(shù)據(jù)。

        b)   申請(qǐng)邏輯

              i.  首先調(diào)用保存

              ii.  然后執(zhí)行提交邏輯

                 各種邏輯驗(yàn)證,這是歷史原因造成的(一個(gè)維護(hù)了幾年的項(xiàng)目代碼邏輯的混亂是難以想象的),總是在提交數(shù)據(jù)時(shí)做雙重較驗(yàn) ,比如數(shù)據(jù)是否有重復(fù)行的邏輯,這里會(huì)反復(fù)讀取申請(qǐng)醫(yī)生表以及醫(yī)生明細(xì)這兩個(gè)申請(qǐng)明細(xì)子表。這也是產(chǎn)生死鎖的主要原因,此場(chǎng)景已經(jīng)滿(mǎn)足了同時(shí)讀取以及修改同一表的情況。除此還會(huì)往其它表中插入數(shù)據(jù),比如一些狀態(tài)跟蹤信息,發(fā)郵件等。

                 至于為什么被分割成兩個(gè)邏輯來(lái)處理這原本是同一動(dòng)作的需求,已經(jīng)法考正最初的設(shè)計(jì)者了,這些邏輯包含各種EntityFramwork的查詢(xún)寫(xiě)法,很難做有效的優(yōu)化。

     2. 壓力設(shè)置

        a)  并發(fā)8個(gè)用戶(hù)

        b)  每1分鐘增加5個(gè)用戶(hù)

 

 [[110028]]

 曾經(jīng)學(xué)過(guò)的方法:

  1. 降低事務(wù)隔離級(jí)別為read uncommitted,結(jié)果是并不能消除死鎖,但死鎖的次數(shù)有所降低,主要時(shí)共享鎖引發(fā)的死鎖次數(shù)降低了。

  2. 分段分析法,也可以說(shuō)是排除法。只執(zhí)行一部分邏輯,比如我們上面的一個(gè)申請(qǐng)分為兩步,先保存后提交,只保存的結(jié)果是死鎖依舊。

  3. 尋找死鎖跟蹤的方法,試圖尋找死鎖的本質(zhì)原因。我簡(jiǎn)單的按我自己的理解翻譯了一些MVP寫(xiě)的文章,大家可以參考 。

        解釋了SQL 中的各種鎖以及它們之間的兼容性,只有了解了這些才能知道鎖發(fā)生的場(chǎng)景,比如知道了共享鎖之間是兼容的就能馬上反應(yīng)出純讀的操作是不會(huì)發(fā)生阻塞的

        事務(wù)隔離級(jí)別的不同會(huì)影響鎖的行為,其中重要說(shuō)明了降低事務(wù)隔離級(jí)別并不能消除死鎖

        只有出現(xiàn)了阻塞才會(huì)升級(jí)成死鎖,所有了解阻塞是***件事

        這篇通過(guò)兩種方式說(shuō)明如何去跟蹤分析死鎖的本質(zhì)原因,通過(guò)SQL自帶的性能監(jiān)控工且可以很方便的導(dǎo)出出現(xiàn)死鎖的相關(guān)信息

        這篇非常詳細(xì)的說(shuō)明了死鎖產(chǎn)生的原理

死鎖文章的重要結(jié)論:

大部分死鎖是因?yàn)槲唇?jīng)過(guò)優(yōu)化的查詢(xún)導(dǎo)致的,但因?yàn)槲覀冺?xiàng)目在處理這個(gè)申請(qǐng)的邏輯中有太多邏輯,不太可能在短時(shí)間內(nèi)進(jìn)行有效的優(yōu)化,所以我暫時(shí)采用了一個(gè)也許不是很好的方案,即想辦法降低排它鎖的相互競(jìng)爭(zhēng),說(shuō)的簡(jiǎn)單點(diǎn)說(shuō)是在程序中通過(guò)一定的手段避免并發(fā)去調(diào)用更新或者插入數(shù)據(jù)的邏輯。

偏門(mén)解決方案:

通過(guò)一個(gè)取票排隊(duì)的隊(duì)列去解決數(shù)據(jù)插入以及更新的并發(fā),原理就是一個(gè)線(xiàn)程想要插入數(shù)據(jù)時(shí),先取票然后排隊(duì),當(dāng)號(hào)輪到它時(shí)才能執(zhí)行數(shù)據(jù)庫(kù)操作,其它線(xiàn)程正在執(zhí)行時(shí),我們通過(guò)自族鎖來(lái)實(shí)現(xiàn)排隊(duì)。這個(gè)方法***程序上解決死鎖的問(wèn)題,但不推薦這么做,之所以采用這種非常規(guī)手段,也是受制于現(xiàn)有程序的邏輯。如果大家在EF中也解決過(guò)死鎖問(wèn)題,可將經(jīng)理分享給我。

  1. public   int AddWithSpinLock(ObjectModel.Request svarRequest) 
  2.  { 
  3.      bool lockTaken = false
  4.      svarRequest.Ticket = Guid.NewGuid(); 
  5.      var newRequestId = 0; 
  6.      try 
  7.      { 
  8.          _spinlock.Enter(ref lockTaken); 
  9.          _queue.Enqueue(svarRequest); 
  10.          while (null != _queue && _queue.Count > 0 && _queue.Peek().Ticket == svarRequest.Ticket) 
  11.          { 
  12.              // do something<br>                    _queue.Dequeue(); 
  13.              return newRequestId; 
  14.          } 
  15.      } 
  16.      catch (Exception ex) 
  17.      { 
  18.          if (lockTaken) _spinlock.Exit(false); 
  19.          _queue.Dequeue(); 
  20.          throw ex; 
  21.      } 
  22.      finally 
  23.      {                
  24.          if (lockTaken) _spinlock.Exit(false); 
  25.      } 
  26.      return newRequestId; 
  27.  } 

原文鏈接:http://www.cnblogs.com/ASPNET2008/p/3604335.html

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

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死

2011-04-02 17:08:44

SQL Server死鎖

2010-11-09 16:20:46

SQL Server死

2010-11-09 16:37:25

Sql server死

2010-11-09 16:29:39

SQL Server死

2023-08-15 08:26:34

SQL Server查找死鎖

2010-07-20 10:27:57

SQL Server

2010-06-30 14:15:08

SQL Server死

2010-07-02 10:53:32

SQL Server死

2009-03-30 10:56:58

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

2011-02-28 13:19:50

SQL Server SQL死鎖

2011-03-08 09:27:34

SQL Server數(shù)死鎖

2010-01-18 10:48:16

SQL Server

2010-08-26 10:45:33

死鎖SQL Server

2024-12-27 00:00:00

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

2010-07-22 14:59:24

SQL Server
點(diǎn)贊
收藏

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