解决SQL server2005数据库死锁的经验心得

前段时间提到的"sql server 2005 死锁解决探索",死锁严重,平均每天会发生一次死锁,在解决和处理SQL server2005死锁中查了很多资料和想了很多办法,后来我们就使用了以下方法: 
   
   1,将数据库隔离级别改成行版本控制隔离级别。(没有了共享锁死锁) 
   
   2,重建和优化索引,优化SQL语句和采用分区视图等方法。提高访问速度。(减少了锁定时间) 
   
   3,水平拆分表(分区)并在程序读写时尽量做到分区消除,减少读写的行数,降低锁定升级的频率和时间。 (减少锁的升级) 
  对为何出现死锁和怎样较少死锁有了进一步认识,在这里和大家一起分享: 
   
   
   
   SQL Server 锁类型 
   在数据库中主要存在两种锁: S(共享锁)和X(排他锁) 
   
   S(共享锁):在执行查询数据时,SQL server会将行锁定,这时只能查询数据,删,改被阻塞, 
   
   X(排他锁):在插入和删除数据时,将行锁定,这时增,删,改都被阻塞 
   
   以上两种锁都会引起死锁: 
   
   死锁定义:在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会造成这些任务永久阻塞,从而出现死锁 
   
   
   
   这里模拟一下死锁环境: 
   
   建立环境: 
  ----死锁例子,建立表数据 
  create table [dbo].[[zping.com1]]]( 
  A varchar(2) 
  ,B varchar(2) 
  ,C varchar(2)) 
   
  --插入数据 
  insert into [dbo].[[zping.com1]]] 
  select ‘a1‘,‘b1‘,‘c1‘ 
  union all select ‘a2‘,‘b2‘,‘c2‘ 
  union all select ‘a3‘,‘b3‘,‘c3‘ 
   
  --建立表数据 
  create table [dbo].[[zping.com2]]] 
  (D varchar(2) 
  ,E varchar(2)) 
   
   --插入数据 
  insert into [dbo].[[zping.com2]]] 
  select ‘d1‘,‘e1‘ 
  union all select ‘d2‘,‘e2‘ 
   
   
   
   1. 1 排他锁引起的死锁 
   执行语句: 
   
  begin tran 
  update [dbo].[[zping.com2]]] 
  set D=‘d5‘ 
  where E=‘e1‘ 
  waitfor delay ‘00:00:05‘ 
   
  update [dbo].[[zping.com1]]] 
  set A=‘aa‘ 
  where B=‘b2‘ 
   
   
  begin tran 
  update [dbo].[[zping.com1]]] 
  set A=‘aa‘ 
  where B=‘b2‘ 
  waitfor delay ‘00:00:05‘ 
   
  update [dbo].[[zping.com2]]] 
  set D=‘d5‘ 
  where E=‘e1‘ 
   
   
   新建两个窗口,在5秒钟内执行上面语句,不久就会出现死锁提示。(结束后记住要把事务回滚啊) 
   
   1.2 共享锁引起的死锁 
  begin tran 
  update [dbo].[[zping.com2]]] 
  set D=‘d5‘ 
  where E=‘e1‘ 
  waitfor delay ‘00:00:05‘ 
   
  select * from [dbo].[[zping.com1]]] 
  where B=‘b2‘ 
   
   
  begin tran 
  update [dbo].[[zping.com1]]] 
  set A=‘aa‘ 
  where B=‘b2‘ 
  waitfor delay ‘00:00:05‘ 
   
  select * from [dbo].[[zping.com2]]] 
  where E=‘e1‘ 
   
   
   新建两个窗口,在5秒钟内执行上面语句。不久就会出现死锁提示。(结束后记住要把事务回滚啊) 
   
   
   
   知道死锁产生的原因,在生产环境产生的死锁就类似这两种情况。 
   
   
   
   后来在网上查阅了很多资料,包括sql server 2005的帮助文档。总结有以下有主要几点: 
   
   1,降低隔离级别或者使用行版本控制隔离级别 
   
   2,提高数据的访问速度 
   
   3,减少事务长度 
   
   4,将按顺序访问热点表(如将访问频繁的表放在最后访问) 
   
   
   
   遇到的困难 
   但在我们这次优化中,有些是不太好处理的 如: 
   
   1,减少事务长度,事务的大小不是我们来决定的,是由业务逻辑来决定的(来自tom的《Oracle 9i/10g深入内部体系机构》中) 
   
   2,按顺序访问热点表,我们发现代码中方法间互相调用很频繁,经常一个表调用多次,要修改表的访问顺序是比较困难的。

时间: 2024-11-06 22:23:57

解决SQL server2005数据库死锁的经验心得的相关文章

解决SQL server2005中插入汉字变成问号的问题(转)

关于SQL server2005中插入汉字变成问号的解决办法 1.右击你所建的数据库,点击“属性”,选择“选项”并点击.将其中的排序规则设置为:Chinese_PRC_CI_AS(选择下拉列表框即可设置),然后“确定“. 2.在表中将你的汉字字段的数据类型设置为nvarchar型或ntext型,设置前最好先将表中的数据全部删除.(不要使用varchar或text型,因为它们只会继续使你的数据乱码). 3.设置好后,关闭服务器,再重新启动,就可生效了.

查询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

解决 Sql Server 数据库总是显示“正在恢复”

SQL Server的应用系统突然间无法访问,访问时出现数据库连接错误,检查当前应用的数据库,数据库显示“正在恢复”, 网上查询了一下解决办法记录一下: 方法一: 1.RESTORE database <数据库名> with norecovery 方法二: 1.停用SQL Server服务     2.将数据库的.mdf和.ldf文件更名     3.启用SQL Server服务     4.右键删除数据库     5.将第二部更名的.mdf和.ldf文件名称改回原来的数据库文件名.    

Sql解锁 数据库死锁检测

USE [DataBaseName]GO/****** Object:  StoredProcedure [dbo].[sp_check_deadlock]    Script Date: 07/04/2014 13:49:30 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO ALTER procedure [dbo].[sp_check_deadlock] asset nocount on /*  select   spid As 被锁

解决SQL Server数据库的孤立用户问题

use 数据库名称 go --使用 sp_change_users_login 修复产生的孤立账户 --列出当前数据库的孤立用户 exec sp_change_users_login 'report' --可以自动将用户名所对应的同名登录添加到 syslogins 中 exec sp_change_users_login 'auto_fix','用户名' --将用户名映射为指定的登录名. exec sp_change_users_login 'update_one','用户名','登陆名'

sql server2005的死锁

select request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' kill spid 每次服务激活时检查.有点蒙,是不是该这样.有什么好办法请告诉我. 测试做一个deadlock: BEGIN TRANSACTION--开始事务 update Sessions set Created=GET

50种方法优化SQL Server数据库查询(转载)

原文地址:http://www.cnblogs.com/zhycyq/articles/2636748.html 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用

转载 50种方法优化SQL Server数据库查询

原文地址 http://www.cnblogs.com/zhycyq/articles/2636748.html 50种方法优化SQL Server数据库查询 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷

SqlServer定时备份数据库和定时杀死数据库死锁解决

PS:Sqlserver 2008 R2,windows 8 64位 1.备份数据库 因为要备份,我们就要用到Sqlserver的代理,默认数据库的代理是不开启的.需要我们手动开启的. 执行备份数据库脚本,现在将脚本公布,其实将这一段代码中需要保存的文件路径和数据库名称替换一下就可以实现备份了.但是还没有达到定时备份的目的 ? 1 2 3 4 5 6 7 8 9 10 11 --自动备份并保存最近5天的SQL数据库作业脚本 宋彪 20130310 DECLARE @filename VARCHA