掌桥专利:专业的专利平台
掌桥专利
首页

一种多表操作引起死锁的解决方法及系统

文献发布时间:2023-06-19 09:30:39


一种多表操作引起死锁的解决方法及系统

技术领域

本发明涉及工业管理技术领域,尤其是涉及一种多表操作引起死锁的解决方法及系统。

背景技术

工业管理中由于涉及到供应链、订单、工程、工艺、品质、成品、工业4.0、集团化等诸多复杂的工业管理环节,所以采用MS SQL SERVER2008作为ERP的数据库。数据库管理者不得不面对成千上万的数据表、数据字段以及上亿数据量的处理。虽然,MS SQLSERVER2008是一个高性能的多用户关系型数据库管理工具,它强大的管理功能和开放式的系统体系结构正被越来越多的人们所认可,但是其性能的提升也无法回避工业管理中多表操作引起的死锁的问题。

工业管理ERP中,由于多用户、多表数据查询、新增、修改、删除以及存储过程,索引,视图,临时表的大量同时使用,经常会有多个用户(进程)分别锁定了一个资源,并又试图请求锁定对方已经锁定的资源。这就产生了一个锁定请求环,导致多个用户(进程)都处于等待对方释放所锁定资源的状态,这便产生了死锁;或者有部分事务处理时间非常长,当查询分析器再次处理其他非常复杂的查询、更新,删除时,由于不能控制处理的顺序,用户又不停发出处理请求,事务等待队列增长迅速,导致了死锁。出现了死锁,必须快速的解决死锁,以便工业企业ERP能够得以继续使用,当然最简单的方法莫过于重启服务或者重启服务器,但是采用该方式用户需要等待更长的时间,而频繁的死锁,频繁的重启,频繁的掉线,对工业企业多用户的ERP而言也是一种巨大的打击。

因此,有必要提供一种新的多表操作引起死锁的解决方法及系统解决上述技术问题。

发明内容

本发明所要解决的技术问题是,提供一种结构简单、用户等待时间少和用户部分工作能快速继续进行的多表操作引起死锁的解决方法及系统。

本发明解决其技术问题所采用的技术方案,一种多表操作引起死锁的解决方法,包括如下步骤:

创建临时表;

将sysprocesses系统表中的进程分为死锁进程、牺牲品和正常进程,然后插入到临时表;

从临时表里面取出数据进行判断,如果为死锁进程则自动杀掉所述死锁进程对应的sysprocesses系统表中的进程;如果为正常进程或者牺牲品则不予理会。

优选的,所述创建临时表包括创建存储过程,通过存储过程建立临时表。

优选的,所述将sysprocesses系统表中的进程分为死锁进程、牺牲品和正常进程,然后插入到临时表包括:获取sysprocesses系统表中的进程的相关信息,然后根据进程的相关信息将进程分为死锁进程、牺牲品和正常进程。

优选的,所述进程的相关信息包括:执行时间、等待的任务数、物理读数、执行过程有无死锁和死锁产生的原因。

本发明还提供了一种多表操作引起死锁的解决系统,包括:获取模块、判断模块、存储模块和死锁处理模块,

所述获取模块,用于获取sysprocesses系统表中进程的相关信息,并将其传送给所述判断模块;

所述判断模块,根据收到的所述进程的相关信息将进程分为死锁进程、牺牲品和正常进程,并将其传送给存储模块;

所述存储模块;所述存储模块,用于存储所述死锁进程、牺牲品和正常进程;

所述死锁处理模块;用于杀死所述存储模块中的死锁进程对应的sysprocesses系统表中的进程。

优选的,所述进程的相关信息包括:执行时间、等待的任务数、物理读数、执行过程有无死锁和死锁产生的原因。

与现有技术相比,本发明通过建立临时表或存储模块将sysprocesses系统表的死锁进程、牺牲品和正常进程存储到临时表或存储模块中,然后在临时表或存储模块中,找到死锁进程,最后通过死锁进程找到sysprocesses系统表相对应的进程并关闭,从而杀掉死锁。而牺牲品和正常进程则不予理会,等杀掉死锁后系统会自动进行处理。该设置相对于重新启动系统解决死锁问题,用户可以节约等待时间,其次,部分原有工作能快速往下进行。

附图说明

图1为本发明的流程示意图;

图2为本发明的结构示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

参照附图1,本实施例提供的解决方法包括如下步骤:

步骤1,创建临时表

通过创建存储过程,定义变量,通过存储过程建立存储进程的临时表;临时表的数据结构可以进行如下设计:

CREATE proc[dbo].[p_lockinfo]--创建存储过程

@kill_lock_spid bit=1,--创建变量,用于是否杀掉死锁的进程,1杀掉,0仅显示

@show_spid_if_nolock bit=1--创建变量,如果没有死锁的进程,是否显示正常进程信息,1显示,0不显示

as

set nocount on

declare@count int,@s nvarchar(1000),@i int

select id=identity(int,1,1),标志,标志的内容为“死锁进程”、“牺牲品”或“正常进程”

进程ID=spid,线程ID=kpid,块进程ID=blocked,数据库ID=dbid,

数据库名=db_name(dbid),用户ID=uid,用户名=loginame,累计CPU时间=cpu,

登陆时间=login_time,打开事务数=open_tran,进程状态=status,

工作站名=hostname,应用程序名=program_name,工作站进程ID=hostprocess,

域名=nt_domain,网卡地址=net_address

步骤2,将sysprocesses系统表中的进程分为死锁进程、牺牲品和正常进程,然后插入到临时表;

1)获取sysprocesses系统表中的进程的相关信息,通过脚本获取目前数据库SQLServer 2008等待时间前50的语句的执行的情况,该执行的情况包括语句执行时间、等待的任务数、物理读数、执行过程有无死锁和死锁产生的具体原因等。然后通过语句的具体执行时间、等待的任务数、物理读数、执行过程有无死锁和死锁产生的具体原因将进程分为死锁进程、牺牲品和正常进程。本实施例中,数据库也可以为其它的数据库,例如SQL Server2005。获取的语句数量还可以为等待时间前100的。

2)通过创建存储过程,将死锁进程、牺牲品和正常进程插入到临时表中。其中临时表中的标志表示是否是“死锁进程、牺牲品和正常进程”。

步骤3,从临时表里面取出数据进行判断,如果为死锁进程则自动杀掉死锁进程对应的sysprocesses系统表中的进程;如果为正常进程或者牺牲品则不予理会。

具体为遍历临时表中的数据,如果数据中的标志字段里的内容为死锁进程,则先找到该数据的进程ID里的值XX,然后关闭sysprocesses系统表中为进程ID的值为XX的进程。如果数据库中的标志字段里的内容为牺牲品或者正常进程,则不予理会,等杀死死锁后系统会自动处理。

本实施例,通过建立临时表将sysprocesses系统表的死锁进程、牺牲品和正常进程存储到临时表中,然后遍历临时表,找到死锁进程,再通过死锁进程找到sysprocesses系统表相对应的进程并关闭掉,从而杀掉死锁。而牺牲品和正常进程则不予理会,等杀掉死锁后系统会自动进行处理。该设置相对于重新启动系统解决死锁问题,用户可以节约等待时间,其次,部分原有工作能快速往下进行。

参照附图2,本实施例提供的解决系统包括:获取模块、判断模块、存储模块和死锁处理模块,

获取模块,用于获取sysprocesses系统表中进程的相关信息,并将其传送给判断模块;

进程的相关信息包括:执行时间、等待的任务数、物理读数、执行过程有无死锁和死锁产生的原因。

判断模块,根据收到的进程的相关信息将进程分为死锁进程、牺牲品和正常进程,并将其传送给存储模块;

存储模块;存储模块,用于存储死锁进程、牺牲品和正常进程;

死锁处理模块;用于杀死存储模块中的死锁进程对应的sysprocesses系统表中的进程。如果是牺牲品或正常进程则不予理会,等杀死死锁后系统自动处理。

本实施例,通过获取sysprocesses系统表中进程的相关信息,并根据进程的相关信息将其分为死锁进程、牺牲品和正常进程存储到存储模块中,然后调用死锁处理模块,杀死存储模块中的死锁进程对应的sysprocesses系统表中的进程,从而解决掉死锁。而牺牲品和正常进程则不予理会,等杀掉死锁后系统会自动进行处理。该设置相对于重新启动系统解决死锁问题,用户可以节约等待时间,其次,部分原有工作能快速往下进行。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

相关技术
  • 一种多表操作引起死锁的解决方法及系统
  • 一种I2C总线通信死锁解决方法
技术分类

06120112195160