SQL server下死結問題

來源:互聯網
上載者:User

標籤:style   color   使用   io   資料   問題   ar   cti   

這幾天在做一個項目,以前都沒怎麼搞過多線程,現在開始,只有邊學邊做了。

一開始的時候,程式報錯是,是提示發生死結,剛開始,自己沒什麼經驗,以為是程式碼的死結,就用lock代碼,把程式給鎖起來了,運行程式後,發現有逾時現象,查閱資料,後來斷定,這個問題是死結是發生是SQL server上的,特地找了下SQL2008的書,看了下,死結的解釋。

 

共用鎖定

獨佔鎖定 

更新鎖定

自訂鎖

 

然後查了資料,查詢SQL死結的 預存程序
 create procedure 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(1,1),spid smallint,bl smallint)
  IF @@ERROR<>0 RETURN @@ERROR
  insert into #tmp_lock_who(spid,bl) select 0 ,blocked
   from (select * from sys.sysprocesses where blocked>0 ) a
   where not exists(select * from (select * from sys.sysprocesses where blocked>0 ) b
   where a.blocked=spid)
   union select spid,blocked from sys.sysprocesses where blocked>0
  IF @@ERROR<>0 RETURN @@ERROR
  
  -- 找到暫存資料表的記錄數
  select @intCountProperties = Count(*),@intCounter = 1
  from #tmp_lock_who
  IF @@ERROR<>0 RETURN @@ERROR
  if @intCountProperties=0
   select ‘現在沒有阻塞和死結資訊‘ as message
  -- 迴圈開始
  while @intCounter <= @intCountProperties
  begin
  -- 取第一條記錄
   select @spid = spid,@bl = bl
   from #tmp_lock_who where id = @intCounter
  begin
   if @spid =0
   select ‘引起資料庫死結的是: ‘+ CAST(@bl AS VARCHAR(10)) + ‘
  進程號,其執行的SQL文法如下‘
  else
   select ‘進程號SPID:‘+ CAST(@spid AS VARCHAR(10))+ ‘被‘ + ‘
  進程號SPID:‘+ CAST(@bl AS VARCHAR(10)) +‘阻塞,
  其當前進程執行的SQL文法如下‘
  DBCC INPUTBUFFER (@bl )
  end
  -- 迴圈指標下移
  set @intCounter = @intCounter + 1
  end
  drop table #tmp_lock_who
  return 0
  end 分析了一下通過自訂鎖 WIHT NOLOCK(注意有髒讀,請根據商務邏輯使用)with rowlock來使用的時候,解決了一部分死結的,但是還是會發生死結的現象尋找了代碼,發現主要出的問題是在一些begin tran的事務上面因為在事務裡面使用delete和update命令的時候,還沒有執行commit或則rollback,如果另一個線程同樣在執行當前的表DELETE命令的時候,會出現阻塞的現象,阻塞是造成死結的前提,oracle好像沒有這個問題,oracle是鎖行的,這個時候,我根據SQL的命令,將UPDATE後面的條件的欄位,在資料庫建立索引,如 delete from table where b=3將欄位b建立索引,就會自動將鎖表變成鎖行,注意如果索引建立的是B欄位,而你條件是C欄位,則不會發生鎖行效果 
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.