1. 程式人生 > >SQLServer+.net 事務鎖表問題

SQLServer+.net 事務鎖表問題

如果 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 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:最後修改程序。對於鎖定的記錄不再進行查詢操作。

SQLServer+.net 事務鎖表問題