成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

動手實戰SQL Server死鎖

數據庫 SQL Server 數據庫運維
最近的一個項目由于客戶明確提出要做下性能壓力測試,使用的工具就是VS自帶的壓力測試工具。以前其它項目做壓力測試后反饋的其中一個重要問題就是數據庫的死鎖。沒想到我們這個項目測試時死鎖同樣的發生了,我之前的項目由于很少參與壓力測試,基本上也不會去了解死鎖,以及死鎖如何解決的問題。

既然有了這個需求,那么要想解決死鎖就需要對死鎖的相關知識有一定的了解,對于非DBA的來講并不需要了解的特別深,知道基本概念以及常見分析方法即可,畢竟我們不靠這個吃飯,沒必要達到特別細的境界。這里我找到了一個微軟MVP寫的一系統博客,對我理解死鎖非常重要,這里分享下目前我為解決死鎖所采用過的方案。

壓力測試的業務場景:

     1.模擬用戶提交申請

         a)  涉及到的表

              i. 申請主表,一次申請生成一條數據。

              ii. 申請的醫生明細,一次申請包含多個醫生,一個申請包含100個醫生

              iii. 單個醫生明細,每個醫生一條明細數據

              綜上所述一條申請的創建,需要插入201條數據。

        b)   申請邏輯

              i.  首先調用保存

              ii.  然后執行提交邏輯

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

                 至于為什么被分割成兩個邏輯來處理這原本是同一動作的需求,已經法考正最初的設計者了,這些邏輯包含各種EntityFramwork的查詢寫法,很難做有效的優化。

     2. 壓力設置

        a)  并發8個用戶

        b)  每1分鐘增加5個用戶

 

 [[110028]]

 曾經學過的方法:

  1. 降低事務隔離級別為read uncommitted,結果是并不能消除死鎖,但死鎖的次數有所降低,主要時共享鎖引發的死鎖次數降低了。

  2. 分段分析法,也可以說是排除法。只執行一部分邏輯,比如我們上面的一個申請分為兩步,先保存后提交,只保存的結果是死鎖依舊。

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

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

        事務隔離級別的不同會影響鎖的行為,其中重要說明了降低事務隔離級別并不能消除死鎖

        只有出現了阻塞才會升級成死鎖,所有了解阻塞是***件事

        這篇通過兩種方式說明如何去跟蹤分析死鎖的本質原因,通過SQL自帶的性能監控工且可以很方便的導出出現死鎖的相關信息

        這篇非常詳細的說明了死鎖產生的原理

死鎖文章的重要結論:

大部分死鎖是因為未經過優化的查詢導致的,但因為我們項目在處理這個申請的邏輯中有太多邏輯,不太可能在短時間內進行有效的優化,所以我暫時采用了一個也許不是很好的方案,即想辦法降低排它鎖的相互競爭,說的簡單點說是在程序中通過一定的手段避免并發去調用更新或者插入數據的邏輯。

偏門解決方案:

通過一個取票排隊的隊列去解決數據插入以及更新的并發,原理就是一個線程想要插入數據時,先取票然后排隊,當號輪到它時才能執行數據庫操作,其它線程正在執行時,我們通過自族鎖來實現排隊。這個方法***程序上解決死鎖的問題,但不推薦這么做,之所以采用這種非常規手段,也是受制于現有程序的邏輯。如果大家在EF中也解決過死鎖問題,可將經理分享給我。

  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

責任編輯:彭凡 來源: 博客園
相關推薦

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死

2011-04-02 17:08:44

SQL Server死鎖

2010-11-09 17:02:43

SQL Server死

2010-11-09 16:37:25

Sql server死

2010-11-09 16:20:46

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死

2011-02-28 13:19:50

SQL Server SQL死鎖

2009-03-30 10:56:58

SQL Server數據庫死鎖數據庫

2011-03-08 09:27:34

SQL Server數死鎖

2010-01-18 10:48:16

SQL Server

2010-08-26 10:45:33

死鎖SQL Server

2010-07-22 14:59:24

SQL Server

2024-12-27 00:00:00

SQL死鎖數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品一级 | 亚洲二区在线 | aⅴ色国产 欧美 | 欧美日韩a| 欧美一区中文字幕 | 99精品视频在线观看免费播放 | 这里只有精品999 | 日韩高清国产一区在线 | 亚洲欧美国产精品久久 | 中文字幕影院 | 日韩电影在线一区 | 国产欧美一区二区三区免费 | 精品免费国产视频 | 精品在线一区 | 国产成人免费视频 | 毛片在线免费 | 日韩一区二区在线视频 | 久久99精品视频 | 日韩在线观看视频一区 | 91影院 | 亚洲国产精品久久久 | 欧美精品a∨在线观看不卡 国产精品久久国产精品 | 成人在线视频观看 | 日韩欧美国产综合 | 国产精品美女久久久久久免费 | 黄色大片网站 | 亚洲区一 | 国产欧美精品一区 | 色免费看 | 日韩免费1区二区电影 | 亚洲成人一区二区 | 国产精品久久久久久久久免费樱桃 | 日韩插插 | 国产精品精品久久久 | 成人精品在线观看 | 一区二区在线不卡 | 一级aaaa毛片| 毛片在线免费 | 最近最新中文字幕 | 久草精品在线 | 日韩亚洲视频 |