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:最后修改程序。对于锁定的记录不再进行查询操作。

时间: 2024-10-19 11:26:25

SQLServer+.net 事务锁表问题的相关文章

浅谈sqlserver的事务锁

锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读 A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读 A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致 并发控制的主要方法是封锁,锁就是在一段时间内禁止

mysql事务锁表

-- 查看被锁住的SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; -- 等待锁定SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; -- 查看事务SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;-- 杀掉trx_mysq_thread_idkill 25496;

sqlserver锁表、解锁、查看锁表

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 面演示一个实例,它使用sys.dm_tran_locks动态视图监视数据库中锁的活动. 打开一个查询窗口,执行如下语句: USE AdventureWorks BEGIN TRAN SELECT ProductID, ModifiedDate FROM Production.ProductDocument WITH (TABLOCKX) 打开另一个查询窗口

[数据库事务与锁]详解五: MySQL中的行级锁,表级锁,页级锁

注明: 本文转载自http://www.hollischuang.com/archives/914 在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足. 在数据库的锁机制中介绍过,在DBMS中,可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎).表级锁(MYISAM引擎)和页级锁(BDB引擎 ). 行级锁 行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁.行级锁能大大减少数据库操作的冲突.其加锁粒度最小,但加锁的

SqlServer 并发事务(二):锁粒度和锁模式

锁粒度: 资源 格式 说明 DATABASE 不适用 resource_database_id 列中已提供数据库 ID. FILE <file_id> 此资源所表示的文件 ID. Object <object_id> 此资源所表示的对象 ID. 此对象可以是sys.objects 中列出的任何对象,不仅仅是表. PAGE <file_id>:<page_in_file> HoBt ID.此值与 sys.partitions.hobt_id 相对应. PAGE

【Sqlserver】各种数据库的锁表和解锁操作

SqlServer 查询被锁住的表和解锁表 --1.查看被锁表 SELECT request_session_id as spid,OBJECT_NAME(resource_associated_entity_id) as tableName FROM sys.dm_tran_locks WHERE resource_type='OBJECT' --spid 锁表进程 :tableName 被锁表名 --2.解锁 declare @spid int Set @spid = 被锁表的进程号 dec

取消sqlserver 锁表

select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' declare @spid int Set @spid = 52 --锁表进程 declare @sql varchar(1000)set @sql='kill '+cast(@spid as varchar)exec(@sql

SqlServer 查看被锁的表和解除被锁的表

查看被锁的表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' 解除被锁的表 declare @spid int Set @spid = 74 --锁表进程 declare @sql varchar(1000) set @sql='kill '+cast(@spid as va

sqlserver锁表查看

sp_lock–查询哪个进程锁表了,spid:进程ID,ObjId:对象ID EXEC sp_executesql N'KILL [spid]'–杀进程 select object_name([ObjId])–查询哪张表被锁 使用sql语句进行查看 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_typ