SQL server下死锁问题

这几天在做一个项目,以前都没怎么搞过多线程,现在开始,只有边学边做了。

一开始的时候,程序报错是,是提示发生死锁,刚开始,自己没什么经验,以为是程序代码的死锁,就用lock代码,把程序给锁起来了,运行程序后,发现有超时现象,查阅资料,后来断定,这个问题是死锁是发生是SQL server上的,特地找了下SQL2008的书,看了下,死锁的解释。

共享锁

排他锁

更新锁

自定义锁

然后查了资料,

查询SQL死锁的 存储过程

create procedure sp_who_lock
  as
  begin
  declare @spid int,@bl int,
  @intTransactionCountOnEntry int,
  @intRowcount int,
  @intCountProperties int,
  @intCounter int
  create table #tmp_lock_who (id int identity(1,1),spid smallint,bl smallint)
  IF @@ERROR<>0 RETURN @@ERROR
  insert into #tmp_lock_who(spid,bl) select 0 ,blocked
   from (select * from sys.sysprocesses where blocked>0 ) a
   where not exists(select * from (select * from sys.sysprocesses where blocked>0 ) b
   where a.blocked=spid)
   union select spid,blocked from sys.sysprocesses where blocked>0
  IF @@ERROR<>0 RETURN @@ERROR
  
  -- 找到临时表的记录数
  select @intCountProperties = Count(*),@intCounter = 1
  from #tmp_lock_who
  IF @@ERROR<>0 RETURN @@ERROR
  if @intCountProperties=0
   select ‘现在没有阻塞和死锁信息‘ as message
  -- 循环开始
  while @intCounter <= @intCountProperties
  begin
  -- 取第一条记录
   select @spid = spid,@bl = bl
   from #tmp_lock_who where id = @intCounter
  begin
   if @spid =0
   select ‘引起数据库死锁的是: ‘+ CAST(@bl AS VARCHAR(10)) + ‘
  进程号,其执行的SQL语法如下‘
  else
   select ‘进程号SPID:‘+ CAST(@spid AS VARCHAR(10))+ ‘被‘ + ‘
  进程号SPID:‘+ CAST(@bl AS VARCHAR(10)) +‘阻塞,
  其当前进程执行的SQL语法如下‘
  DBCC INPUTBUFFER (@bl )
  end
  -- 循环指针下移
  set @intCounter = @intCounter + 1
  end
  drop table #tmp_lock_who
  return 0
  end

分析了一下

通过自定义锁 WIHT NOLOCK(注意有脏读,请根据业务逻辑使用)with rowlock来使用的时候,解决了一部分死锁的,但是还是会发生死锁的现象

查找了代码,发现主要出的问题是在一些begin tran的事务上面

因为在事务里面使用delete和update命令的时候,还没有执行commit或则rollback,如果另一个线程同样在执行当前的表DELETE命令的时候,会出现阻塞的现象,阻塞是造成死锁的前提,oracle好像没有这个问题,oracle是锁行的,这个时候,我根据SQL的命令,将UPDATE后面的条件的字段,在数据库建立索引,如 delete from table where b=3

将字段b建立索引,就会自动将锁表变成锁行,注意如果索引建立的是B字段,而你条件是C字段,则不会发生锁行效果

SQL server下死锁问题

时间: 2024-08-24 03:50:20

SQL server下死锁问题的相关文章

SQL SERVER 下PadLeft函数

在.net中,可以使用String.PadLeft函数左对齐字符串,在左边用指定的Unicode字符填充以达到指定的总长度.      例如:在做自动编号这样使用 1: int ID = da.GetMaxNum() + 1; 2: this.tbID.Text = ID.ToString().PadLeft(6, '0'); 1: --在sql中 2: 3: --功能:右对齐的字符,在左边用指定的字符填充以达到指定的总长度. 4: --原始字符 @num:填充字符 @paddingChar:字

SQL SERVER - 谈死锁的监控分析解决思路

1 背景 1.1 报警情况 最近整理笔记,打算全部迁移到EVERNOTE.整理到锁这一部分,里边刚好有个自己记录下来的案例,重新整理分享下给大家. 某日中午,收到报警短信,DB死锁异常,单分钟死锁120个. 死锁的xml文件如下: 1 <deadlock-list> 2 <deadlock victim="process810b00cf8"> 3 <process-list> 4 <process id="process810b00c

SQL Server下实现利用SQL Server Agent Job对索引重建实现Balance Load

昨天工作中遇到这样一个场景,有个项目需要把某台服务器下所有的表和索引都启用数据压缩(data_compression=page),已经启用了的表和索引就不需要再压缩一次了.统计一下后发现要运行的REBUILD INDEX代码多达上万条,而整个服务器上的所有需要压缩的数据库对象大小加起来估计接近1TB.这种情况下如果把所有工作都交给一条脚本来完成,估计整个周末都跑不完.那么我们的想法就是用多个SQL Server Agent Job来做完成这个任务,分配单位是表(也就是说把同一张表的所有索引重建任

Sql Server 检测死锁的SQL语句

首先创建一个标量值函数DigLock,用来递归检测SqlServer中的每一个会话是否存在加锁循环,如果该函数最终返回1则表示检测到了加锁循环 (也就是说检测到了死锁),如果最终返回0则表示没有检测到加锁循环. 1 CREATE FUNCTION [dbo].[DigLock] 2 ( 3 @spid int, 4 @orginSpid int 5 ) 6 RETURNS bit 7 AS 8 BEGIN 9 declare @blockedSpid int=null; 10 11 select

ACCESS与SQL Server下SQL Like 查询的不同

在ACCESS中LIKE的用法Access里like的通配符用法是这样: “?”表示任何单一字符: “*”表示零个或多个字符: “#”表示任何一个数字 所以应该是: select * from databasename where fieldname like '*XX*' 在SQL SERVER 里是用%表示零个或多个字符: select * from databasename where fieldname like '%XX%'

SQL Server下ADO.NET 怎么获取数据库SQL语句INSERT,UPDATE,DELETE了多少行数据

ADO.NET 在发送SQL语句到SQL Server数据库后,怎么知道真正INSERT,UPDATE,DELETE了多少行数据呢? 使用SQL Server内置的全局变量@@ROWCOUNT即可,@@ROWCOUNT可以返回在当前数据库连接(SqlConnection)中,执行的上一条SQL语句影响了多少行数据,使用示例如下所示: INSERT INTO [dbo].[Person]([PersonCode],[Name],[Age],[City]) VALUES (N'P8000',N'He

SQL SERVER 查询死锁

方法一: WITH    CTE_SID ( BSID, SID, sql_handle ) AS ( SELECT   blocking_session_id , session_id , sql_handle FROM     sys.dm_exec_requests WHERE    blocking_session_id <> 0 UNION ALL SELECT   A.blocking_session_id , A.session_id , A.sql_handle FROM  

SQL Server 查看死锁的存储过程(转载)

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_who_lock]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[sp_who_lock] GO use master go create procedure sp_who_lock as begin declare @spid int,@bl int, @int

查询MS SQL Server数据库死锁的一个存储过程

查询Sqlserver数据库死锁的一个存储过程 使用sqlserver作为数据库的应用系统,都避免不了有时候会产生死锁.死锁出现以后,维护人员或者开发人员大多只会通过sp_who来查找死锁的进程,然后用sp_kill杀掉. 利用sp_who_lock这个存储过程,可以很方便的知道哪个进程出现了死锁,出现死锁的问题在哪里. --创建或修改sp_who_lock存储过程 CREATE procedure sp_who_lock --ALTER procedure sp_who_lock as beg