標籤: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欄位,則不會發生鎖行效果