码迷,mamicode.com
首页 > 数据库 > 详细

SQLServer+.net 事务锁表问题

时间:2017-07-21 01:19:55      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:过程   查看   style   strong   启动   ast   被锁   spi   sts   

最近操作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 事务锁表问题

标签:过程   查看   style   strong   启动   ast   被锁   spi   sts   

原文地址:http://www.cnblogs.com/coolsundy/p/7215313.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!