SQL 进程死锁

SQL 进程死锁,第1张

首先,需要把你的AutoCommit=TRUE,然后,这是一个编程习惯问题,在pb中,对于数据窗口的 *** 作,首先设置数据窗口的提交方式,我一直
采用 key columns,use
update,然后记得在每次连接完成后,记得及时释放,譬如,在retrieve完成后,记得及时利用resetupdate()清除数据状态,然后,
再每次数据库更新,也就是update()后,记得利用
ll_num1=update()
if ll_num=1 then
commit;
dw_freeresetupdate( )
else
rollback;
messagebox("提示!","数据保存失败! ")
end if
以上说法我不赞同:
1、首先AutoCommit=TRUE,以后执行delete,update,insert语句都相当执行了commit,如果是把几个SQL语句当作是一个完整的事务,要不整
体成功提交,要不rollback,这就写就不会得到正确的结果。
2、其次key columns,use update,要具体情况具体使用,这种形式的并发性最差,适合对数据的并发性要求不高的场合。
3、再次程序的死锁原因是多方面的,上述两个方面只是其中的原因罢了,具体情况具体分析,例如数据尽快提交、建立合理的索引、合理的SQ
L语句、避免交叉事务、对于数据量庞大的表,应及时转移到历史库,我想可以很大程度上避免死锁。
以上愚见,欢迎拍砖。
在MSSQL控制台中,管理-当前活动-锁/进程ID看看是那几个进程在死锁,然后在进程信息中将这些死锁的进程杀死/
对查询进行优化
也建议检查:外键建立索引,如果上索引,再调试下网络
对外键建索引可以缓解这个问题。
如在商品字典和销售明细表中,销售明细表中商品编号是外键,如果在销售明细表的商品编号上没有索引,update商品字典会造成销售明细表
整表锁表。
解决Sybase数据库死锁的方法
人民银行吉林市中心支行科技处 刘志明
在联机事务处理(OLTP)的数据库应用系统中,多用户、多任务的并发性是系统最重要的技术指标之一。为了提高并发性,目前大部分RDBMS都采
用加锁技术。然而由于现实环境的复杂性,使用加锁技术又不可避免地产生了死锁问题。因此如何合理有效地使用加锁技术,最小化死锁是开
发联机事务处理系统的关键。
死锁产生的原因
在联机事务处理系统中,造成死机主要有两方面原因。一方面,由于多用户、多任务的并发性和事务的完整性要求,当多个事务处理对多个资
源同时访问时,若双方已锁定一部分资源但也都需要对方已锁定的资源时,无法在有限的时间内完全获得所需的资源,就会处于无限的等待状
态,从而造成其对资源需求的死锁。
另一方面,数据库本身加锁机制的实现方法不同,各数据库系统也会产生其特殊的死锁情况。如在Sybase SQL Server 11中,最小锁为2K一页
的加锁方法,而非行级锁。如果某张表的记录数少且记录的长度较短(即记录密度高,如应用系统中的系统配置表或系统参数表就属于此类表)
,被访问的频率高,就容易在该页上产生死锁。
几种死锁情况及解决方法
清算应用系统中,容易发生死锁的几种情况如下:
● 不同的存储过程、触发器、动态SQL语句段按照不同的顺序同时访问多张表;
● 在交换期间添加记录频繁的表,但在该表上使用了非群集索引(non-clustered);
● 表中的记录少,且单条记录较短,被访问的频率较高;
● 整张表被访问的频率高(如代码对照表的查询等)。
以上死锁情况的对应处理方法如下:
● 在系统实现时应规定所有存储过程、触发器、动态SQL语句段中,对多张表的 *** 作总是使用同一顺序。如:有两个存储过程proc1、proc2,
都需要访问三张表zltab、z2tab和z3tab,如果proc1按照zltab、z2tab和z3tab的顺序进行访问,那么,proc2也应该按照以上顺序访问这三张
表。
● 对在交换期间添加记录频繁的表,使用群集索引(clustered),以减少多个用户添加记录到该表的最后一页上,在表尾产生热点,造成死锁
。这类表多为往来账的流水表,其特点是在交换期间需要在表尾追加大量的记录,并且对已添加的记录不做或较少做删除 *** 作。
● 对单张表中记录数不太多,且在交换期间select或updata较频繁的表可使用设置每页最大行的办法,减少数据在表中存放的密度,模拟行级
锁,减少在该表上死锁情况的发生。这类表多为信息繁杂且记录条数少的表。
如:系统配置表或系统参数表。在定义该表时添加如下语句:
with max_rows_per_page=1
● 在存储过程、触发器、动态SQL语句段中,若对某些整张表select *** 作较频繁,则可能在该表上与其他访问该表的用户产生死锁。对于检查
账号是否存在,但被检查的字段在检查期间不会被更新等非关键语句,可以采用在select命令中使用at isolation read uncommitted子句的方
法解决。该方法实际上降低了select语句对整张表的锁级别,提高了其他用户对该表 *** 作的并发性。在系统高负荷运行时,该方法的效果尤为
显著。
例如:
selectfrom titles at isolation read uncommitted
● 对流水号一类的顺序数生成器字段,可以先执行updata流水号字段+1,然后再执行select获取流水号的方法进行 *** 作。
小结
笔者对同城清算系统进行压力测试时,分别对采用上述优化方法和不采用优化方法的两套系统进行测试。在其他条件相同的情况下,相同业务
笔数、相同时间内,死锁发生的情况如下:
采用优化方法的系统: 0次/万笔业务;
不采用优化方法的系统:50~200次/万笔业务。
所以,使用上述优化方法后,特别是在系统高负荷运行时效果尤为显著。总之,在设计、开发数据库应用系统,尤其是OLTP系统时,应该根据
应用系统的具体情况,依据上述原则对系统分别优化,为开发一套高效、可靠的应用系统打下良好的基础。
经验:
1:前台问题:检视代码查看事物是否被提交或回滚。
2:后台问题:有时候由于处理的问题复杂度高。数据库日志空间已满或不够
导致事物未能提交。UNIX下的SYBAE就是典型的一例。解决办法各数据库厂商有更详细的说明。
虽然我从9转到10遇到了好多问题,也浪费了好几天的时间,但到了现在,我真觉得10比9好。
10没有了MSSQL专用接口,用的是OLEDB接口,用这个接口一定要注意一个问题是表死锁的事!
网上讲的连接方式都是天下一大抄。
用OLEDB要加上 SQLCALock = "RC",
不然连查询也会死锁。
另个一个就是10写的软件不再乱码了,我在繁体写的软件在简体下运行不乱码,反之也可以。
第三就是编译速度明显快很多。
第四就是编译的时候有了XP样式皮肤,感觉漂亮多了。
编程要是要养成好习惯,在sql语句insert和update之后,要及时commit,数据窗口update()后也要及时commit;
阻塞是因为多个进程对同一一个资源的访问冲突,当一个进程排它访问一个资源时(从进入事务到事务结束为止),当有其他进程需要访问同
样的资源时,即造成阻塞(根据锁的级别和粒度设置);
在实际应用中阻塞可能因为事务没有提交或者网络速度太慢或者大容量的数据查询等都可能会造成阻塞。
阻塞可以通过sp_who 系统存储过程进行查看,执行sp_who 后查看所有blk不等于
0的进程ID(SPID),直到找到SPID在blk列出现,但当前spid 的blk列 =0 即它就是阻塞的源头。
最简单的办法可用 kill spid(源头进程的SPID值),同时结合sp_lock过程可查看到当前进程的加锁情况(如锁的类型被锁的对象)
最后最重要的是要根据 在查询到源头后,使用 DBCC INPUTBUFFER (spid)查看最后一次提交的内容,即可找到因为事务没有提交造成的阻塞(
一般不能使用 AutoCommit=True,因为大部分MIS程序需要使用批提交,来保证数据的完成性)
>事实上解决这种故障的原理非常简单,即只要将硬盘上的主引导扇区的所有内容清为0,使这种硬盘如同新盘,就可以解决死锁问题。问题是这种硬盘接入机器后,机器无法引导 *** 作系统,所以不能使用在 *** 作系统下运行某些刷新主引导扇区程序的方法来解决。如何在未引导 *** 作系统的情况下不低格硬盘解决死锁问题呢?为此,笔者通过实践研究,找到了一种非常简单的方法,无须启动 *** 作系统或对硬盘进行低格,可万无一失解决硬盘循环死锁问题。

由于误 *** 作(如:错误地使用压缩代理)或病毒感染等原因,硬盘有时会产生一种“硬盘死锁”故障。所谓硬盘死锁,是指电脑在引导机器载入 *** 作系统过程中,由于循环分配驱动器盘符,导致驱动器逻辑盘符用尽而使机器陷入死循环状态,最后使机器无法正常启动 *** 作系统。硬盘死锁一旦发生,其故障现象是:只要故障硬盘安装到电脑中,就无法从硬盘、软驱启动 *** 作系统。即使把故障硬盘安装成从属IDE设备,同样会导致正常软硬盘无法引导机器。这种硬盘的故障现象,其表象似乎比真正的物理故障盘还严重,其实这是一种纯软故障。但由于这种故障硬盘安装到电脑中后,正常盘也不能引导机器了,所以一般的解决方法是,使用 CMOS SETUP中的低级格式化功能对其进行低格。然而用这种方法存在很多弊病。

事实上解决这种故障的原理非常简单,即只要将硬盘上的主引导扇区的所有内容清为0,使这种硬盘如同新盘,就可以解决死锁问题。问题是这种硬盘接入机器后,机器无法引导 *** 作系统,所以不能使用在 *** 作系统下运行某些刷新主引导扇区程序的方法来解决。如何在未引导 *** 作系统的情况下不低格硬盘解决死锁问题呢?为此,笔者通过实践研究,找到了一种非常简单的方法,无须启动 *** 作系统或对硬盘进行低格,可万无一失解决硬盘循环死锁问题。

观察死锁硬盘的故障现象,不难看出这种故障是在引导 *** 作系统的过程中产生的,如果能在分配驱动器盘符之前,把对硬盘引导扇区刷新的指令写入软系统盘的引导扇区,让BOIO程序执行这个特别的引导扇区,就可以达到目的。

具体 *** 作方法如下:

1先取下带有循环死锁故障硬盘,准备一张系统软盘(带有DEBUG调试程序)和一张空白软盘,并将空白软盘格式化。

2生成一张特殊软盘。用系统软盘启动机器,执行DEBUG命令后,取出系统盘,插入空白软盘(待制作的特殊软盘),在DEBUG环境下进行如下 *** 作:

A:>DEBUG

-A 0100

XXXX:0100 XOR AX,AX

XXXX:0102 PUSH AX

XXXX:0103 POP DS

XXXX:0104 PUSH AX

XXXX:0105 POP ES

XXXX:0106 MOV CX,100

XXXX:0109 MOV BX,7C00

XXXX:010C MOV WORD PTR [BX],00

XXXX:0110 INC BX

XXXX:0111 INC BX

XXXX:0112 LOOP 10C

XXXX:0114 MOV AX,0301

XXXX:0117 MOV CX,0001

XXXX:011A MOV DX,80

XXXX:011D MOV BX,7C00

XXXX:0120 INT 13

XXXX:0122 JMP FFFF:0000

XXXX:0127

-W 100 0 0 1

-Q

通过以上 *** 作,特殊软盘就制作好了。

3 关闭机器,制作好的特殊软盘保留在软盘驱动器中。将故障硬盘装回机器中,其电缆连接方法决定了上述MOV DX,80指令送入DX寄存器中的值。若将故障盘联接成第一硬盘或系统中只接有此故障硬盘,即上述MOV DX,80指令中送入DX寄存器的值为80H,若系统中接有两个硬盘,且将故障盘连接成第二硬盘,即送入DX寄存器的值应为81H。

4上电重新启动机器,当机器开始从软盘载入 *** 作系统时,大约过2-3秒钟后,机器会自动复位重启动。

5 将特殊软盘取出,插入正确系统软盘,让机器从软盘引导 *** 作系统。若无意外,机器就会正常启动,当机器出现A:>提示符时,标志着故障硬盘的循环死锁故障已经排除。此后就可以对该硬盘进行正常的分区格式化等 *** 作。如果试图恢复硬盘上的数据,请不要分区格式化,接着进行下一步骤。

6用 KV300(Z+版以上)引导机器,执行KV300杀毒软件,用该软件的硬盘分区扫描恢复功能,对硬盘进行分区扫描,即按 F10功能键,然后插入一张格式化好的空盘,回答“Y”,耐心等待十几分钟,再回答“Y”,当屏幕显示“OK!OK!OK!”的提示时。就表示硬盘的分区已恢复。重新启动机器,一切完好如初。

快速解决开机速度慢的原因

开机速度慢的案例。在打印社工作的小胡每天一打开电脑进入桌面短则需要几十秒,长则需要几分钟的时间。最近她惊讶的`发现这让她天天焦急的等待时间正在一点点的增长令他抓狂的难耐。然而对于这一切,她毫无办法,网上搜索了一下“开机速度慢怎么办”“开始速度慢的原因是什么”发现网友的回答简直就是长篇大论很难看懂,似乎对她这种小白网民来说并不适用。 如:“首先打开系统配置实用程序,按照次序进行系统ini文件的核对,再将不必要的服务,启动项关闭。最后清理注册表中的冗余键值”这一系列的专业名词把她多次下定的决心打的溃不成军,是导致开机速度慢迟迟没能得到解决的根本原因。一日在好玩要好的朋友聊天时。她的朋友告诉她用一个叫“金山卫士”的安全软件能够通过简单的 *** 作解决这一系列问题,他特别开心立刻回家打开电脑下载该软件,在下载使用后发现的确有效。现在真的不用熬那长达数分钟的开机时间了。大量网友询问开机速度慢的原因。开机速度慢怎么办。

最近大量网友在it站和百度知道,soso问问平台里反馈“开机速度慢,开机速度慢怎么办,开机速度慢的原因是什么”的问题,但是网友给出的答案 *** 作比较繁琐,如:“首先打开系统配置实用程序,按照次序进行系统ini文件的核对,再将不必要的服务,启动项关闭。最后清理注册表中的冗余键值”,不适合普通用户 *** 作,下面金山安全专家帮大家分析一下

启动项目就是开机的时候系统会在前台或者后台运行的程序,当Windows( *** 作系统)完成登录过程,进程表中出现了很多的进程!Windows在启动的时候,自动加载了很多程序。许多程序的自启动,给我们带来了很多方便,这是不争的事实,但不是每个自启动的程序对我们都有用;更甚者,也许有病毒或木马在自启动行列!

大部分网友开机速度慢是由于安装过多的软件,并且软件设置了随开机启动,或加上计划任务定时启动,或加载服务随机启动,很多小白用户不了解这个情况,导致开机速度慢,还有些是被病毒木马利用进行开机启动开机速度慢怎么办呢?用金山卫士四步开机速度优化我们的把怎样设置开机启动项简化为四个步骤方便您的 *** 作:

1、下载金山卫士。

2、点击软件顶部导航栏的“系统优化”,选择“开机加速”按钮。

3、根据金山卫士的提示对不必要的开机启动项,服务,计划任务进行一键优化。

4、重启电脑,您将发现,开机速度较之从前已有了长足的进步。

ADSL设置后电脑变慢了如何解决

现在的电信广告做的是非常的“神忽”让很多的朋友都感觉到受不了,那只好也用起了电信宽带了但是,不久发现系统启动明显变慢,尤其是在进入系统时,机子简直就像处于假死状态,要一分多钟才能反应过来。问题背景:邻居家上的是512K 的包月宽带,因为只有一台电脑,所以未启用ADSL的路由功能和配置DHCP。

机器装有Windows XP系统,使用PPPoE拨号上网,经检查上网速率正常且无任何硬件故障。这就怪了,上网前后除使用外置ADSL和使用主板内置的网卡外与之前并无任何区别。难道是网卡的设置问题吗?由此想到默认情况下Windows XP在启动时会对网卡等网络设备进行自检,如果发现网卡的IP地址等未配置好就会对其进行设置,这可能是导致系统启动变慢的真正原因。

找到了问题所在,也就好解决了。解决之道:打开“本地连接”属性菜单,双击“常规”项中的“Internet协议”打开“TCP/IP属性”菜单。将网卡的IP地址配置为一个在公网(默认的网关是19216811)中尚未使用的数值如1921681X,X取介于2~255之间的值,子网掩码设置为 2552552550,默认网关和DNS可取默认设置。设置完成后确定,故障完全排除,系统启动完全正常。

OK大功告成了,以后有需要及时联系我。

电脑开机速度慢的解决方法(一)

电脑开机速度慢对电脑使用者的体验会大大降低。通过下面的几种手法可以改善开机速度慢的方法:

1、禁用闲置的IDE通道

加速原理:由于Windows XP系统在启动的过程中会自动对电脑上的IDE设备进行检测,因此关闭对闲置的IDE通道的检测从而加速系统启动。不过,针对网络上流传的错误说法需要纠正一下:很多人以为单纯在BIOS中禁用闲置的IDE通道就可以了,还有的人建议同时在BIOS和系统中同时关闭。首先,第一种方法是根本无效的,因为XP *** 作系统可以绕过主板的BIOS独立监控计算机硬件的各种状态;而后一种方式又显得多此一举。所以只能也只需在 Windows XP系统中关闭,才能真正的达到禁用闲置IDE通道的效果。

做法如下:右键点击“我的电脑-属性”,然后点击“硬件”接着点击“设备管理器”,在其中打开“IDE ATA/PATA控制器”(不同芯片略有差异),然后分别进入主要和次要IDE通道,选择“高级设置”,在这里找到“当前传送模式”为“不适用”的一项(这就是闲置的IDE通道所对应的),将此项的“设备类型”设置为“无”,确定即可。

2、手动设置IP地址

加速原理:Windows XP系统是在Windows 2000基础上发展而来,因此支持丰富的网络功能。在这其中Windows XP系统会在开机之后自动检测电脑是否联入局域网,但是一般用户都是单机上网,并且在网络连接中基本上设置的都是自动获取IP地址。如此以来,系统为了给该机指派一个IP地址就会搜索DHCP服务器,但是一般用户根本不会配置。这就造成每次开机之后,系统都会花很长的时间来搜索DHCP服务器直到获得IP地址或者服务超时才会停止,这期间即使来到桌面,双击程序也没有任何反映。这也就是很多使用Windows XP用户反映的进入桌面后出现“死机”10几秒钟的问题!事实上只要为“本地连接”人工指派一个IP地址就可以简单的解决这个问题,避免Windows XP每次开机的自动网络检测,从而加速启动!

做法如下:右键点击“网上邻居”-选择属性,进入窗口后右键点击“本地连接”-选择属性,在这里双击“Internet协议(TCP/IP)”,选择“使用下面的IP地址”然后输入一个IP地址(比如:19216801),子网掩码默认即可。(这样做不会与您上互连网产生任何冲突,这个地址只是用在局域网内的)这样系统再次搜索就会很快的发现IP并快速进入系统。

3、禁用暂时不用的设备

加速原理:现在电脑外围设备价格便宜了不少,很多人购买了U盘、移动硬盘等等产品,但是不少的朋友总是在使用后忘记断开这些USB设备与主机的连接,由于Windows XP系统启动会自动检测USB接口,因此这些设备如果在开机时与主机连接着会造成系统启动缓慢。笔者就亲身经历过朋友的电脑连接着移动硬盘开机后无法进入系统,只有断开连接线才能进入的情况。因此大家在使用完U盘、移动硬盘这些USB设备后,及时的断开与主机的连接,同时也防止开机电流冲击等意外情况损坏设备(因为目前很多机箱厂商为了减少成本,在前置USB接口上根本没有必要的保护电路,甚至没有必要的接地)。另外,使用笔记本的朋友如果暂时用不上红外线以及无线网卡等设备,也应该在设备管理器中禁用。因为这些扩展设备尤其是网卡对于系统启动的速度影响巨大。禁用之后达到跳过系统启动检测的目的加速启动过程。

另外还要注意:由于系统默认会自动读取光驱,因此启动时会对光驱进行检测,如果光驱中放置了光盘,就会自动读取,如果是多媒体光盘那么读取花费的时间就会更长,同样延长电脑的启动时间。所以建议大家平时使用完光盘记得及时取

出来。

4、关闭主题清减桌面

很多朋友喜欢漂亮的主题或者壁纸,可是漂亮是有代价的,那就是消耗了大量的内存,同时桌面上有太多图标也是一样。因为系统每次启动到显示桌面时,首先需要检查是否启用主题,一旦发现就会加载,很多的主题就这样吃掉了大量的内存(另外很多网友自己制作的主体并不完善,使用后会出现很多兼容问题造成系统故障)。同时系统还会查找和验证桌面快捷方式的有效性,因此快捷方式越多,所花费的验证时间就越长。建议大家平时尽量不要使用主题,最多设置一张漂亮的壁纸就可以了。然后将桌面快捷方式分门别类放到专门的文件夹中便于管理,加速启动一举两得!

5、关闭多余的启动程序

不少软件会在系统启动后自动运行一些后台程序,比如:Winamp、office等等

这些程序都会让启动变得缓慢,大家应该通过“开始-运行” 输入“msconfig”回车-“启动”在这里关闭多余的启动项。平时只要保留输入法、防火墙就可以了(根据个人设置)。

另外,建议大家不要将内存优化软件设置为开机整理。因为开机整理内存不仅效果很小,还会严重影响启动速度,正确的做法应该是在运行PhotoShop等需要大量内存的软件之后,使用内存整理会有更名显得效果。(其实从Win2000开始 *** 作系统自身的内存管理已经相当完善,发展到如今的winXP对于内存的管理更为科学有效,使用内存整理效果有限)

6、杀毒软件也麻烦

有些杀毒软件提供了系统启动扫描功能,这将会耗费非常多的时间,其实如果你已经打开了杀毒软件的实时监视功能,并且定时对系统查毒,那么启动时扫描系统就显得有些多余,还是将这项功能禁止吧!

开机启动的东西多了,也会造成启动慢建议用下优化软件优化启动速度

减少开机启动项目,按下述办法修改注册表:

(1)加快开机及关机速度

选择“开始”菜单中的“运行”命令,在“运行”对话框键入“regedit”命令后回车,即可启动注册表编辑器,找到HKEY_CURRENT_USERControlPanelDesktop,将字符串值HungAppTimeout的数值数据更改为200,将字符串值WaitToKillAppTimeout的数值数据更改为1000另外在HKEY_LOCAL_MACHINESystemCurrentControlSetControl,将字符串值HungAppTimeout的数值数据更改为200,将字符串值WaitToKillServiceTimeout的数值数据更改1000

(2)减少开机滚动条时间

启动注册表编辑器,找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory ManagementPrefetchParame ters,在右边找到EnablePrefetcher主键,把它的默认值3改为1,这样滚动条滚动的时间就会减少。

(3)加快预读能力改善开机速度

打开注册表编辑器,找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSessionManagerMemoryManagement,在PrefetchParameters右边窗口,将EnablePrefetcher的数值数据如下更改,如使用PIII 800MHz CPU以上的建议将数值数据更改为4或5。

(4)利用CPU的L2 Cache加快整体效能

打开注册表编辑器,找到HKEY_LOCAL_MACHINESYSTEMCurrentContro

lSetControlSessionManager,在MemoryManagement的右边窗口,将SecondLevelDataCache的数值数据更改为与CPU L2 Cache相同的十进制数值:例如:P4 16G A的L2 Cache为512Kb,数值数据更改为十进制数值512。

产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
程序死锁的解决办法:
(1)合理安排表访问顺序。
(2)在事务中尽量避免用户干预,尽量使一个事务处理的任务少些, 保持事务简短并在一个批处理中。
(3)数据访问时域离散法, 数据访问时域离散法是指在客户机/服务器结构中,采取各种控制手段控制对数据库或数据库中的对象访问时间段。主要通过以下方式实现: 合理安排后台事务的执行时间,采用工作流对后台事务进行统一管理。工作流在管理任务时,一方面限制同一类任务的线程数(往往限制为1个),防止资源过多占用; 另一方面合理安排不同任务执行时序、时间,尽量避免多个后台任务同时执行,另外, 避免在前台交易高峰时间运行后台任务。
(4)数据存储空间离散法。数据存储空间离散法是指采取各种手段,将逻辑上在一个表中的数据分散到若干离散的空间上去,以便改善对表的访问性能。主要通过以下方法实现: 第一,将大表按行或列分解为若干小表; 第二,按不同的用户群分解。
(5)使用尽可能低的隔离性级别。隔离性级别是指为保证数据库数据的完整性和一致性而使多用户事务隔离的程度,SQL92定义了4种隔离性级别:未提交读、提交读、可重复读和可串行。如果选择过高的隔离性级别,如可串行,虽然系统可以因实现更好隔离性而更大程度上保证数据的完整性和一致性,但各事务间冲突而死锁的机会大大增加,大大影响了系统性能。
(6)使用绑定连接, 绑定连接允许两个或多个事务连接共享事务和锁,而且任何一个事务连接要申请锁如同另外一个事务要申请锁一样,因此可以允许这些事务共享数据而不会有加锁的冲突。
作为一个系统设计员,我想是不会考虑用单一的办法解决死锁问题,应该具体问题具体分析。

死锁一般是编程及优化方面的问题,用引擎优化顾问(不知道2000有没有呵呵)优化一下索引看看
一般死锁在数据库中会瞬间被解除,客户反映的卡应该属于阻塞,你应该往优化方面考虑
用profiler检测一下耗时的严重的语句,想办法优化业务流程以及数据处理流程
2008性能方面肯定是优于2000的,但是如果你程序设计的很烂的话,再优越也体现不出来

根据2中提供的sql,查看那个spid处于wait状态,然后用kill spid来干掉。当然这只是一种临时解决方案,我们总不能在遇到死锁就在用户的生产环境上排查死锁,Kill sp,我们应该考虑如何去避免死锁。

使用SET LOCK_TIMEOUT timeout_period(单位为毫秒)来设定锁请求超时。默认情况下,数据库没有超时期限timeout_period值为-1,可以用SELECT @@LOCK_TIMEOUT来查看该值,即无限期等待。当请求锁超过timeout_period时,将返回错误。

timeout_period值为0时表示根本不等待,一遇到锁就返回消息。设置锁请求超时,破环了死锁的第二个必要条件(请求与保持条件)。

服务器: 消息1222,级别16,状态50,行1已超过了锁请求超时时段。

SQL Server内部有一个锁监视器线程执行死锁检查,锁监视器对特定线程启动死锁搜索时,会标识线程正在等待的资源;然后查找特定资源的所有者,并递归地继续执行对那些线程的死锁搜索,直到找到一个构成死锁条件的循环。检测到死锁后,数据库引擎 选择运行回滚开销最小的事务的会话作为死锁牺牲品,返回1205 错误,回滚死锁牺牲品的事务并释放该事务持有的所有锁,使其他线程的事务可以请求资源并继续运行。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/13081256.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-30
下一篇 2023-05-30

发表评论

登录后才能评论

评论列表(0条)

保存