SQLServer+.net 事務鎖表問題


最近操作Sqlserver遇到一個鎖表問題。找了好久才搞明白原因和解決辦法。

故障現象:

  每次啟動事務后,執行了刪除或者修改操作以后,再執行查詢操作就鎖表。

 

解決過程:

  1:最初以為SQLServer進行刪除和修改操作后是表鎖定機制,造成無法查詢,結果不是。

  2:搜索查詢鎖表的SQL,分析了一下鎖表過程。

查看被鎖表:
select   request_session_id   spid,OBJECT_NAME(resource_associated_entity_id) tableName   
from   sys.dm_tran_locks where resource_type='OBJECT'
--spid   鎖表進程 
--tableName   被鎖表名
解鎖:
declare @spid  int 
Set @spid  = 57 --鎖表進程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid  as varchar)
exec(@sql)
--查詢出死鎖的SPID
select blocked
from (select * from sysprocesses where  blocked>0 ) a 
where not exists(select * from (select * from sysprocesses where  blocked>0 ) b 
where a.blocked=spid)
--輸出引起死鎖的操作
DBCC INPUTBUFFER (@spid)
--查詢當前進程數
select count(-1) from sysprocesses 
where dbid in (select dbid from sysdatabases where name like '%telcount%');

 3:最后發現原因,原因在於,delete操作時如果是刪除指定一條記錄,SQLServer就會對該條記錄進行了行鎖定,這時如果再查詢該條記錄,就會造成死鎖。

      同樣的SQL語句和操作。我在Oracle中從來沒有發現過,所以造成這個問題找了半天。

 4:最后修改程序。對於鎖定的記錄不再進行查詢操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM