zoukankan      html  css  js  c++  java
  • 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:最后修改程序。对于锁定的记录不再进行查询操作。

  • 相关阅读:
    SQL 使用identity(int,1,1)来产生行号。
    SQL DateName\DatePart 返回表示指定date的指定datepart的字符串
    让我们受用一生的好习惯
    SCRUM软件开发过程(转)
    计算机英语词汇
    oral English英语绕口令(转)
    Setup相关经验总结
    与老外吵架之必会109句
    BAT批处理文件语法(转)
    SQL Server 2005之PIVOT/UNPIVOT行列转换(转)
  • 原文地址:https://www.cnblogs.com/coolsundy/p/7215313.html
Copyright © 2011-2022 走看看