前段时间提到的"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,按顺序访问热点表,我们发现代码中方法间互相调用很频繁,经常一个表调用多次,要修改表的访问顺序是比较困难的。

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

  1. [Bug] 解决 Sql Server 数据库死锁问题

    SELECT request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName FROM sys.dm_tra ...

  2. 快速定位MS Sql Server 数据库死锁进程

    最近在做一个大型项目,由于数据设计采用离散型数据库设计,以方便需求变更及用户自定义流程要素,因为要素用户自定义,数据完整性靠代码约束变得不太现实,只能依靠表间关系来约束,结果因此导致数据的操作经常产生 ...

  3. 解决sql server2008数据库安装之后,web程序80端口被占用问题(终极方案)

    解决sql server2008数据库安装之后,web程序80端口被占用问题(终极方案) 前言:原来电脑上的Apache一直使用正常,在安装sql server2008后,突然发现Apache无法启动 ...

  4. 解决SQL SERVER数据库备份时出现“操作系统错误5(拒绝访问)。BACKUP DATABASE 正在异常终止。”错误的解决办法

    SQL SERVER数据库进行备份时出现“操作系统错误5(拒绝访问).BACKUP DATABASE 正在异常终止.”错误.我们应该如何解决这个问题?小编今天为大家推荐一个解决办法. 一般备份文件选择 ...

  5. 纯C++ 连接SQL Server2005 数据库读写操作的小例子

    一个测试c++链接 sql server 数据库的例子// 数据库说明// 数据库用户为 sa , 密码为 空// 数据库为 MyDB// 表为 UserInfo// 表字段为 Name . Pass ...

  6. c#读取并分析sql Server2005数据库日志

    用过logExplorer的朋友都会被他强悍的功能吸引,我写过一篇详细的操作文档可以参考http://blog.csdn.net/jinjazz/archive/2008/05/19/2459692. ...

  7. Sql解锁 数据库死锁检测

    USE [DataBaseName]GO/****** Object:  StoredProcedure [dbo].[sp_check_deadlock]    Script Date: 07/04 ...

  8. [SQL] 如何在SQL Server2005数据库中检查一个表是否存在,如存在就删除表记录,如不存在就建表.

    . 检索 dbo.sysobjects表, select count(*) from dbo.sysobjects where xtype='U' and Name = '你的表名' . 根据返回的结 ...

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

    上周五组长对我说了一句要杀死数据库的死锁进程,有时候同一时刻不停写入数据库会造成这种情况的发生,因为自己对数据库不是很熟悉,突然组长说了我也就决定一定要倒腾一下,不然自己怎么提高呢?现在不研究,说不定 ...

随机推荐

  1. oracle mysql的序列的新增、删除、修改及使用

    序列的使用  参考文献: https://blog.csdn.net/meijory/article/details/51891529 1.序列介绍 序列: 是 oracle 提供的用于产生一系列唯一 ...

  2. js 常见事件

  3. CSAPP阅读笔记-汇编语言初探(数据传送类指令)-来自第三章3.2-3.3的笔记-P115-P128

    1.如何由机器代码生成汇编代码? objdump -d再加上文件名即可直接在终端看到由反汇编器恢复的汇编代码.注意,文件名并不一定得是.o文件,任何可执行文件都可以. 结果如下: 仅列举了反汇编tes ...

  4. JS及Dom示例 | 分级菜单折叠

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Case When ELSE END语句

    一.简介.Case  When   ELSE   END共有两种用法: 说实话,这种就是数据库版的switch语句,但是只是形式上很像,实际上还是有差别的!!! Create Table Test6( ...

  6. Git学习系列之集中式版本控制系统vs分布式版本控制系统

    不多说,直接上干货! Linus一直痛恨的CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢? 先说集中式版本控制系统,版本库是集中存放在中央 ...

  7. ServiceHelper

    public class ServiceHelper { private static string _baseUrl = $@"http://{Config.Instance.MesSer ...

  8. Shell脚本之awk详解

    一.基本介绍 1.awk: awk是一个强大的文本分析工具,在对文本文件的处理以及生成报表,awk是无可替代的.awk认为文本文件都是结构化的,它将每一个输入行定义为一个记录,行中的每个字符串定义为一 ...

  9. 朝圣Java(问题集锦)之:The Apache Tomcat installation at this directory is version 8.5.32. A Tomcat 8.0 inst

    最近开始学Java了.有C#底子,但是学起来Java还是很吃力,感觉别人架好了各种包,自己只要调用就行了,结果还有各种bug出现.掩面中. 启动Tomcat的时候,报错The Apache Tomca ...

  10. Java中的断言 Assert

    今天正好遇到了,就记一下 一.作用: 用与编写单元测试 二.assert 关键字 assert 理论上和 if类似, 但是assert 仅仅用于测试, 不能用于业务 如果发现断言无效, 则可能时ide ...