解决sybase数据库的死锁问题

在使用数据库操作时,由于多人同时使用,导致数据库某些表无法访问,原因可能是由于多个用户操作同一个表,争抢统一资源出现死锁现象,现将解决死锁的方法总结如下:

1、执行  sp_who 语句,观察执行结果是查询出来的表,查看结果中的【state】列中存在lock...的项,证明数据库中有死锁,此时查看【blk_spid】必然不是0,应该会是某个id例如2257

2、其实此时就可以通过 kill 2257 语句来干掉,就可以使用数据库了;

3、不过我们也可以通过 SELECT * FROM master..sysprocesses WHERE status LIKE '%lock%'  语句来查到有哪些死锁,然后查看这些信息的blocked列,可以看到这些死锁是由于哪个死锁引起的,杀掉即可

4、sp_lock  可以查看到一些信息,帮助理解

 

 

下面是我从网上其他地方找到详细的解释:

 

死锁的发生对系统的性能和吞吐量都有重要影响,经检测发现,管理信息系统的死锁主要是因为两个或多个线程(登录)抢占同一表数据资源。引起长时间抢占同一资源不是因为我们需要处理的事务太复杂,时间太长,而往往是因为我们在前端应用程序对数据库作操作时忘了提交.本文介绍一种处理解决这种死锁的方法。 
Sybase封锁原理 
数据共享与数据一致性是一对不可调和的矛盾,为了达到数据共享与数据一致,必须进行并发控制。并发控制的任务就是为了避免共享冲突而引起的数据不一致。Sybase SQL Server并发控制的方法是加锁机制(LOCKING)。
锁的类型 可申请的锁  已有的锁 S U X 
S        ∨    ∨    × 
U       ∨    ×    × 
X       ×    ×    ×

Sybase SQL Server有三种封锁类型:排它锁(exclusive lock,简称X锁);共享锁(share lock,简称S锁);更新锁(update lock,简称U锁)。这三种锁的相容矩阵表如下: 
×:表示不兼容。∨:表示兼容。Sybase SQL Server是自动决定加锁类型的。一般来说,读(SELECT)操作使用S锁,写(UPDATE,INSERT和delete)操作使用X锁。U锁是建立在页级上的,它在一个更新操作开始时获得,当要修改这些页时,U锁会升级为X锁。 
锁的力度

SQL Server有两级锁:页锁和表锁。通常页锁比表锁的限制更少(或更小)。页锁对本页的所有行进行锁定,而表锁则锁定整个表。为了减小用户间的数据争用和改进并发性,SQL Server试图尽可能地使用页锁。

当SQL Server决定一个语句将访问整个表或表的大多数页时,它用表锁来提供更有效的锁定。锁定策略直接受查询方案约束,如果update或delete语句没有可用的索引,它就执行表扫描或请求一个表锁定。如果update或delete语句使用了索引,它就通过请求页锁来开始,如果影响到大多数行,它就要请求表锁。一旦一个语句积累的页锁超过锁提升阈值,SQL Server就设法给该对象分配一个表锁。如果成功了,页锁就不再必要了,因此被释放。表锁也在页层提供避免锁冲突的方法。对于有些命令SQL Server自动使用表锁。 
锁的状态

SQL SERVER加锁有三种状态: 
1)意向锁(intend)—是一种表级锁,它表示在一个数据页上获得一个S或X锁的意向。意向锁可以防止其他事务在该数据页的表上获得排它锁。

2)阻塞(blocking,简记blk)—它表明目前加锁进程的状态,带有blk后缀的锁说明该进程目前正阻塞另一个需要获得锁的进程,只有这一进程完成,其他进程才可以进行。

3)需求锁(demand)—表示此时该进程企图得到一个排它锁。它可以防止在这一表或页上加过多的S锁,她表示某一事务是下一个去锁定该表和该页的事务。

需求锁是一个内部过程,因此用sp_lock是无法看见的。 
死锁DEADLOCK

简单地说,有两个用户进程,每个进程都在一个单独的页或表上有一个锁,而且每个进程都想在对方进程的页或表上请求不相容锁时就会发生“死锁”。在这种情况下,第一个进程在等待另一进程释放锁,但另一进程要等到第一个进程的对象释放时才会释放自己的锁。

SQL Server检查是否死锁,并终止事务中CPU时间积累最小的用户(即最后进入的用户)。SQL Server回滚该用户的事务,并用消息号1205通知有此死锁行为的应用程序,然后允许其他用户进程继续进行。

在多用户情形下,每个用户的应用程序都应检查每个修改数据的事务是否有1205号消息,以此确定是否有可能死锁。消息号1025表示该用户的事务因死锁而终止并被回滚。应用程序必须重新开始这个事务处理。 
查找死锁原因 
既然管理信息系统长时间死锁的原因是由于我们提交或者是提交不当,那么我们就可以通过修改程序防止出现死锁。定位死锁出错处主要经过以下三步: 
1)在死锁出现时,用SP_WHO,SP_LOCK获得进程与锁的活动情况。 
2)结合库表sysobjects和相应的操作员信息表查出被锁的库表与锁住别人的操作员。 
3)根据锁定的库表与操作员的岗位,可以估计出程序大约出错处。询问操作员在死锁时执行的具体操作即可完全定位出错处。最后查找程序并修改之。 
用sp_who获取关于被阻碍进程的信息

系统过程sp_who给出系统进程的报告。如果用户的命令正被另一进程保持的锁阻碍,则: 
◆status列显示“lock sleep”。 
◆blk列显示保持该锁或这些锁的进程标识,即被谁锁定了。 
◆loginame列显示登录操作员。结合相应的操作员信息表,便可知道操作员是谁。 
Fid spid status loginame origname blk dbname cmd 
0 1 lock sleep lm lm 18 QJYD SELECT 
0 2 sleeping NULL NULL 0 master NETWORK HANDLER 
0 3 sleeping NULL NULL 0 master NETWORK HANDLER 
…… 
用sp_lock浏览锁

要得到关于当前SQL Server上保持的锁的报告,可用系统过程sp_lock [spid1[,spid2]],spid1,spid2是表master.dbo.sysprocesses中的sql server进程id号,用sp_who可以得到锁定与被锁定的spid号: 
◆locktype列显示加锁的类型和封锁的粒度,有些锁的后缀还带有blk表明锁的状态。前缀表明锁的类型:Sh—共享锁,Ex—排它锁或更新锁,中间表明锁死在表上(”table”或’intent’)还是在页上(page). 后缀“blk”表明该进程正在障碍另一个需要请求锁的进程。一旦正在障碍的进程一结束,其他进程就向前移动。“demand”后缀表明当前共享锁一释放, 该进程就申请互斥锁。 
◆table_id列显示表的id号,结合sysobjects即可查出被封锁的表名。 
执行该进程后屏幕显示 
Fid Spid locktype table_id page row dbname Class context 
0 1 Sh_intent 678293476 0 0 QJYD Non Cursor LockFam dur 
0 1 Sh_page 678293476 31764 0 QJYD Non Cursor Lock 
0 18 Ex_intent 9767092 0 0 QJYD Non Cursor LockFam dur 
…… 
定位出错处

根据sp_who与sp_lock命令的结果,结合sysobjects和相应的操作员信息表。得到操作员及其在死锁时所操作的库表,便大约可以知道应用程序的出错处,再询问操作员在死锁时执行什么操作以进一步认证。最后查找程序并修正之。

 

转载于:https://www.cnblogs.com/latter/p/5961230.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256195.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭开.NET 2.0配置之谜(一)

2010-03-20 15:33 by 吴秦, 4828 阅读, 20 评论, 收藏, 编辑 此文是译文,原文是Jon Rista,Unraveling the Mysteries of .NET 2.0 Configuration,由于这篇文章比较长,所以我就分为几部分来翻译。 以前没有翻译过外文,看…

Pytorch基础(六)——激活函数

一、概念 激活函数顾名思义,就是一种可以给神经网络注入灵魂的一种方法,也可以称之为激活层。其计算就是将线性的函数转变为非线性函数的过程,只有这样,我们制作的深层神经网络才能无限逼近真实值。 自神经网络发展到目前为止&am…

android数据的五种存储方式

Android提供了5种方式存储数据1 使用SharedPreferences存储数据它的本质是基于XML文件存储key-value键值对数据&#xff0c;通常用来存储一些简单的配置信息。其存储位置在/data/data/< >/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改&…

【NOIP 模拟题】[T1] 等差数列(dp)

【题解】【dp】 【f[i][j]表示以i为结尾&#xff0c;j为公差的子序列个数】 【要注意有负数&#xff0c;所以将公差1000】 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int const p9901; int f[1010][2010],n,a[1010]; lo…

走在网页游戏开发的路上(十)

页游资源管理 现在页游的规模越来越来大&#xff0c;游戏内容丰富&#xff0c;资源管理变得很重要。现在一款SNS页游的所有资源可达50M&#xff0c;MMO页游更高达几百M&#xff0c;不可能把资源放到一个文件里面、也不可能一次性加载完所有资源。按200kb/s的下载速度来算&#…

Pytorch基础(七)——线性层(全连接层)

一、概念 在神经网络中&#xff0c;我们通常用线性层来完成两层神经元间的线性变换。 按照官网的解释&#xff0c;Linear.weight也即A&#xff0c; 我们可以称之为权重矩阵&#xff0c;对其转置后乘以输入数据(一般都是一维张量)&#xff0c;加上Linear.bias即b偏置。 二、P…

跨线程取出控件的值的写法(不是跨线程赋予控件值)

//这个方法是跨线程取出控件的值&#xff0c;不是跨线程赋予控件值private delegate void DelegateGetControl(各种参数);private void GetControl(各种参数&#xff0c;和委托的参数是一样的){try{if (this.InvokeRequired){//如果是跨线程的控件&#xff0c;就调用委托去实现…

使系统生成50个0-9之间的随机数,将每个数字出现的次数 存入一个一维数组中,统计出现次数最多和出现次数最少的数字,及出现次数 和出现频率。...

int [] numsnew int[10]; for(int i0;i<50;i){ int num(int)(Math.random()*10);//随机生成0-9 nums[num];//生成随机数 对应下标位置 自增 } int maxIndex0;//存储出现最多次数的下标 int minIndex0;//存储出现最少次数的下标 //循环数组 for(int i1;i<nums.length;i){ …

PureMVC(AS3)剖析:吐槽

PureMVC&#xff08;AS3&#xff09;剖析&#xff1a;吐槽 写在前面 世上没有银弹——不存在适用于所有情况的框架&#xff0c;只有适合的框架。再者任何一个好的东西&#xff08;语言、框架等&#xff09;最终还取决于用的人&#xff0c;语言和框架本身并不能保证用户的代码清…

Pytorch基础(八)——正则化

一、概念 正则化在深度学习领域是为了防止训练结果过拟合而采取的一种方法。 1.1 过拟合 过拟合表示模型的泛化能力较差&#xff0c;体现在实际训练模型上就是在训练集表现很好&#xff0c;但是在测试集的效果一般。 过拟合的原因&#xff1a;1&#xff0c;模型过于复杂。2&…

uva 11997 K Smallest Sums 优先队列处理多路归并问题

题意&#xff1a;K个数组每组K个值&#xff0c;每次从一组中选一个&#xff0c;共K^k种&#xff0c;问前K个小的。 思路&#xff1a;优先队列处理多路归并&#xff0c;每个状态含有K个元素。详见刘汝佳算法指南。 1 #include<iostream>2 #include<cstdio>3 #includ…

.net生成随机字符串

生成随机字符串的工具类&#xff1a; /// <summary>/// 随机字符串工具类/// </summary>public class RandomTools{/// <summary>/// 随机系数/// </summary>public static int _RandIndex 0;#region 获取某个区间的一个随机数/// <summary>///…

【图像处理】——Python鼠标框选ROI(感兴趣)区域并且保存(含鼠标事件)

鼠标交互切割矩形 接下来,就是本文重点了。先吐个槽,网上有资源,但搜到的都是C++的。本来有点气馁的,还好,有官网在,文档写得很清楚,而且接口函数名字变化不大,稍微做下修改就行了。 import cv2global img global point1, point2 def on_mouse(event, x, y, flags, pa…

c++ 11 override final

C 11添加了两个继承控制关键字&#xff1a;override和final。 override确保在派生类中声明的重载函数跟基类的虚函数有相同的签名。final阻止类的进一步派生和虚函数的进一步重载 出处&#xff1a;http://www.cnblogs.com/zhangdongsheng/ 作者&#xff1a;张东升

泛型方法与桥方法

Java泛型中有存在一种方式叫做类型擦除&#xff0c;也就是说泛型在编译期间进行类型检验上做到有效安全&#xff0c;但是在运行当中&#xff0c;会将该泛型类型用顶层父类&#xff08;若无继承关系则用Object&#xff09;代替&#xff0c;然后再进行强转换成目标类型&#xff0…

Pytorch基础(九)——损失函数

一、概念 损失函数在深度学习领域是用来计算搭建模型预测的输出值和真实值之间的误差。 具体实现过程&#xff1a;在一个批次&#xff08;batch&#xff09;前向传播完成后&#xff0c;得到预测值&#xff0c;然后损失函数计算出预测值和真实值之间的差值&#xff0c;反向传播…

用程序猿思维、程序设计师思维两种方式写求斐波那契数列的方法。

//用Java实现斐波那契数列(Fibonacci) public class Test {public int f(int n)//n代表第几个数字。程序返回它相应的值{return n>2?f(n-1)f(n-2):1;//看似如此优雅的一句程序}//程序设计师的思维&#xff1a;会重构上面的代码。让他们更易读。推荐&#xff01;&#xff01…

【图像处理】——图像的差集、并集、补集、交集以及两个图像相减出现负数的处理方法

目录 目录 1、交集 2、差集 3、并集 4、补集 5、差为负值,和超过255的解决办法

Pytorch基础(十)——优化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)

一、概念 Pytorch中优化器的目的&#xff1a;将损失函数计算出的差值Loss减小。 优化过程&#xff1a;优化器计算网络参数的梯度&#xff0c;然后使用一定的算法策略来对参数进行计算&#xff0c;用新的参数来重新进行训练&#xff0c;最终降低Loss。 其中官网提供了13种优化算…