解决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,按顺序访问热点表,我们发现代码中方法间互相调用很频繁,经常一个表调用多次,要修改表的访问顺序是比较困难的。
解决SQL server2005数据库死锁的经验心得相关推荐
- 搭建WAMP5环境,连接SQL Server2005数据库问题汇总
经过两周的测试.修改,终于将网上药品采购系统从公司内部OA系统中独立出来,用WAMP5重新搭建了PHP网上药品采购系统.现将遇到的问题汇总如下: 1.数据库连接失败的问题,提示 Fatal error ...
- vb.net 安装部署以及远程连接sql server2005数据库
Vb.net工程做完了,打包好了.但是前一段时间一直连接不上数据库,我是指连接远程的数据库. 对于原先用vb6.0做的东西来说,直接通过控制面板中的数据源设定就可以了,但是现在是通过字符串连接的.于是 ...
- mysql2005安装asp_asp连接sql server2005数据库
首先,新建一个asp.net网站. 然后打开Default.aspx输入一下中的代码. 无标题页 SqlConnection MyConnection; MyConnection = new SqlC ...
- 服务器 消息 22029,解决SQL Server数据库维护计划失败的问题
概要 如果数据库维护计划中的任何任务失败或遇到错误信息,则维护计划作业本身可能显示为失败.作业历史记录详细信息显示以下错误信息: sqlmaint.exe failed.[SQLSTATE 42000 ...
- 解决Sql server数据库不兼容问题
记录一下SQL sever 2016版本在SQLserver2008R2上无法正常使用问题. 温馨提示:如果已经有数据库,不需卸载数据库. 解决办法如下: 下载 SQL Server Manageme ...
- 使用纯C++实现SQL Server2005 数据库读写操作详细步骤
环境:虚拟机windows xp,vs2008 + SQLServer 2005 Express 数据库访问技术采用ADO. 需要安装的软件包括:microsoft_dotnetfxchs2.0.ex ...
- 如何把Sql Server2005 数据库转换成Access
1.打开Access,建立一个后缀名为.mdb的空的数据库文件(默认后缀可能是.accdb,我们把它改为.mdb就可以了),然后保存该Access空数据库. 2.在SqlServer2005里面右击想 ...
- python 连接MS sql server2005数据库
在google上有个开源的项目叫pymssql 项目地址:https://code.google.com/p/pymssql/ 看来段代码 import pymssql conn = pymssql. ...
- SQL Server2005 日期字段与字符串比较的怪异问题
遇到了这样一个怪异问题. SQL Server2005数据库里有一个表,表中有一个DateTime类型的字段CreateDate. 如果在SQL语句里写 where CreateDate <= ...
最新文章
- 浅谈CSRF攻击方式
- CNCF 沙箱项目 OCM Placement 多集群调度指南
- 上传图片即时显示图片
- win7 VS2013 新建工程 编译lua5.2.0 静态库
- Anaconda中下载速度贼慢?
- python实现邮件客户端_利用python实现简单的邮件发送客户端示例
- 各种类型变量的定义以及赋值
- 什么叫做展望_开学季:有一种爱, 叫做爸妈给你塞的行李箱!(附大学新生行李箱应怎么选?)...
- 强大!用 60 行代码自动抢微信红包
- 怎么做好饮料代理?如何发展市场
- linux服务添加互信,Linux多节点互信配置
- mipi-csi-2解读_CSI:Visual Studio-无法将索引X处的Unicode字符转换为指定的代码页
- 爬虫之-bilibili视频下载-下载链接获取
- feather初体验
- Word格式之参考文献交叉引用
- 提升领导力的8点建议
- 2014年湛江新教育交流会总结
- jquey学习篇 第一篇
- 商业化广告--体系学习-- 14 -- 业务实战篇 --转化优化:互联网大厂如何利用算法优化广告效果?
- 小学生算术加法测试c 语言,程序设计方法学课程设计--小学生算术四则运算测试程序(C)...