SQLServer+.net 事務鎖表問題
阿新 • • 發佈:2017-07-21
如果 net tel sso 表鎖定 pro exists tro object
最近操作Sqlserver遇到一個鎖表問題。找了好久才搞明白原因和解決辦法。
故障現象:
每次啟動事務後,執行了刪除或者修改操作以後,再執行查詢操作就鎖表。
解決過程:
1:最初以為SQLServer進行刪除和修改操作後是表鎖定機制,造成無法查詢,結果不是。
2:搜索查詢鎖表的SQL,分析了一下鎖表過程。
查看被鎖表: select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks whereresource_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:最後修改程序。對於鎖定的記錄不再進行查詢操作。
SQLServer+.net 事務鎖表問題