针对大规模应用程序的数据库死锁诊断方法及系统技术方案

技术编号:37818479 阅读:12 留言:0更新日期:2023-06-09 09:50
本发明专利技术提供了一种针对大规模应用程序的数据库死锁诊断方法及系统,包括:步骤S1:将待测应用程序的单元测试使用动态符号执行引擎运行,并收集执行记录;步骤S2:基于收集的执行记录构建事务级别冲突图,基于事务级别冲突图选择事务冲突环,分别根据事务冲突环构建相应的语句级别冲突图;基于语句级别冲突图提取语句冲突环;步骤S3:分别分析语句冲突环中所有冲突边是否可能产生锁冲突,当所有冲突边均可能产生锁冲突,则基于语句冲突环生成相应的死锁判定条件,并输入至SMT求解器进行求解,当求解结果为SAT,则表示有死锁发生,并提供诊断报告;当求解结果为UNSAT或求解时间超时,则表示没有死锁发生。没有死锁发生。没有死锁发生。

【技术实现步骤摘要】
针对大规模应用程序的数据库死锁诊断方法及系统


[0001]本专利技术涉及死锁诊断领域,具体地,涉及针对大规模应用程序的数据库死锁诊断方法及系统。

技术介绍

[0002]应用程序通常使用数据库系统来管理数据,以及使用数据库提供的事务来保护关键的业务逻辑。现有数据库系统多使用锁来隔离并发执行的事务,当事务想要获取一个正在被其他事务所持有的锁,需要等待,当多个事务之间存在循环等待时,就会发生死锁。现有的数据库(如MySQL,PostgreSQL,SQL Server等)通常采用先检测后恢复的策略来处理死锁。如果一个事务当前执行的语句被其他事务所阻塞时,数据库会进行死锁检测,检测事务之间是否存在循环等待的关系,若存在则表示有死锁发生,数据库会回滚其中一个参与死锁的事务进行恢复,这种先检测后恢复的方法浪费了CPU的计算资源,从而影响了应用的性能。
[0003]数据库对死锁先检测后处理的方法严重影响了应用的性能,实际上应用开发者可以通过修改代码逻辑或添加应用级别的锁来避免发生数据库死锁,这个前提是开发者需要能够定位到可能导致死锁的应用代码。人工定位死锁相关代码对于现有的应用来说代价较大,现有工作尝试采用自动化死锁诊断,现有的自动死锁诊断工作通常采用静态分析从应用代码中提取出每一个事务的SQL语句,通过分析SQL语句之间的冲突关系判断是否可能发生死锁,最后再定位到参与死锁的SQL语句关联的应用代码。
[0004]现如今,在为大规模应用程序进行数据库死锁诊断主要面临以下两个挑战:(1)由于程序规模较大,使用现有静态方法如符号执行或模型检查无法从应用程序中提取事务与SQL语句信息。(2)现有的死锁诊断方法对数据库锁只采用了粗粒度建模,具体来说只考虑了表级的锁,当两个SQL语句访问同一张表且其中一条SQL对表进行修改时,便视为两条SQL语句之间存在冲突。这种做法导致了死锁诊断的高假阳率。因此,先前的工作对于针对大规模应用程序的数据库死锁诊断研究并不深入,先前的工作对于这个方面的研究还有一定的空白。目前,还没有一个统一的自动化针对大规模应用程序的数据库死锁诊断方法与工具。
[0005]随着动态符号执行技术和SMT求解器技术的成熟使自动化针对大规模应用程序的数据库死锁诊断方法与工具成为可能。动态符号执行技术是一种结合了符号执行与具体执行的程序分析技术,通过动态符号执行技术来测试程序时,能够用符号化信息表示程序路径上的所有可能执行状态。动态符号执行引擎是使用动态符号执行技术运行程序的工具,一方面,动态符号执行引擎维护了一个符号表,用来保存运行时变量到符号表达式的映射;另外,动态符号执行引擎能够记录程序执行的路径条件,并将其编码成一阶逻辑表达式。动态符号执行引擎运行时捕获应用程序中的运算操作,如赋值运算,算术运算,位运算,逻辑运算,关系运算等运算,如果运算中有符号化的变量参与,那么将此运算结果变量符号化;若当前应用程序正在执行条件分支语句,且有符号化的变量参与,那么动态符号执行引擎会将分支条件记录到路径条件中。同时,SMT求解器是针对一阶逻辑表达式的自动求解工
具,可以判断该表达式的可满足性。给定一阶逻辑表达式,如果SMT求解器返回SAT,表示该表达式可满足,并返回一组该表达式中变量的具体取值;如果SMT求解器返回UNSAT,表示该表达式不可满足。本专利拟利用动态符号执行技术和SMT求解器技术设计实现自动化针对大规模应用程序的数据库死锁诊断方法与工具。

技术实现思路

[0006]针对现有技术中的缺陷,本专利技术的目的是提供一种针对大规模应用程序的数据库死锁诊断方法及系统。
[0007]根据本专利技术提供的一种针对大规模应用程序的数据库死锁诊断方法,包括:
[0008]步骤S1:将待测应用程序的单元测试使用动态符号执行引擎运行,并收集执行记录;
[0009]步骤S2:基于收集的执行记录构建事务级别冲突图,基于事务级别冲突图选择事务冲突环,分别根据事务冲突环构建相应的语句级别冲突图;基于语句级别冲突图提取语句冲突环;
[0010]步骤S3:分别分析语句冲突环中所有冲突边是否可能产生锁冲突,当所有冲突边均可能产生锁冲突,则基于语句冲突环生成相应的死锁判定条件,并输入至SMT求解器进行求解,当求解结果为SAT,则表示有死锁发生,并提供诊断报告;当求解结果为UNSAT或求解时间超时,则表示没有死锁发生;
[0011]所述事务级别冲突图是一个有向图,该有向图中每个点对应来自一个执行记录实例中的一个事务,每个双向边连接两个事务,所连接的两个事务访问了同一张表且其中一个事务对当前表进行了修改;
[0012]所述语句级别冲突图是一个有向图,该有向图中每个点对应一个事务中的一条SQL语句,语句级别冲突图中有两种有向边,包括顺序边和冲突边;所述顺序边是从一条SQL语句指向同一个事务内的下一条SQL语句;所述冲突边连接两条SQL语句,所连接的两条SQL语句属于不同事务,且访问了同一张表同时其中一条SQL语句对当前表进行修改;
[0013]所述事务冲突环是事务级别冲突图中的有向环,一个语句级别冲突图通过一个事务冲突环中所有事务的语句构建;所述语句冲突环是语句级别冲突图中的有向环。
[0014]优选地,所述步骤S1采用:
[0015]步骤S1.1:设置待测应用程序的单位测试程序、测试所需的输入、应用所使用的数据库状态以及使用动态符合执行引擎提供的接口标记需要符号化的输入;
[0016]步骤S1.2:将待测应用程序的单元测试程序通过动态符号执行引擎执行,并收集执行记录,包括:事务信息与路径条件;
[0017]所述事务信息是通过对动态符号执行引擎扩展从而追踪应用程序运行过程中对数据库驱动函数的调用,实现对事务信息的收集;所述收集的事务信息包括事务开始语句、事务读写语句以及事务提交语句;
[0018]所述路径条件是程序在动态符号执行过程中执行的分支跳转指令的判断条件;符号执行引擎每次执行分支跳转指令时,会记录具体的判断条件。
[0019]优选地,所述步骤S2采用:为每一个测试的执行记录创建两个相同的实例并根据所有执行记录的实例创建事务级别冲突图。
[0020]优选地,对语句冲突环进行过滤处理,减少语句冲突环中SQL语句的数量;
[0021]所述过滤处理包括:对于语句冲突环中的相邻两条边都是顺序边的语句,将与该语句相邻的两个语句用顺序边连接,并从当前语句冲突环中删除该语句,重复触发执行直至没有SQL语句可被删除。
[0022]优选地,所述步骤S3采用:
[0023]步骤S3.1:分别分析冲突边的两条语句可能访问的所有数据库索引以及相关的语句查询条件;
[0024]步骤S3.2:分别为两条语句推断所有可能申请的数据库锁;
[0025]步骤S3.3:比较两条语句所有可能申请的数据库锁,如果两条语句可能申请互相冲突的锁,则表示可能产生锁冲突。
[0026]优选地,所述基于语句冲突环生成相应的死锁判定条件包括:当前语句冲突环路本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种针对大规模应用程序的数据库死锁诊断方法,其特征在于,包括:步骤S1:将待测应用程序的单元测试使用动态符号执行引擎运行,并收集执行记录;步骤S2:基于收集的执行记录构建事务级别冲突图,基于事务级别冲突图选择事务冲突环,分别根据事务冲突环构建相应的语句级别冲突图;基于语句级别冲突图提取语句冲突环;步骤S3:分别分析语句冲突环中所有冲突边是否可能产生锁冲突,当所有冲突边均可能产生锁冲突,则基于语句冲突环生成相应的死锁判定条件,并输入至SMT求解器进行求解,当求解结果为SAT,则表示有死锁发生,并提供诊断报告;当求解结果为UNSAT或求解时间超时,则表示没有死锁发生;所述事务级别冲突图是一个有向图,该有向图中每个点对应来自一个执行记录实例中的一个事务,每个双向边连接两个事务,所连接的两个事务访问了同一张表且其中一个事务对当前表进行了修改;所述语句级别冲突图是一个有向图,该有向图中每个点对应一个事务中的一条SQL语句,语句级别冲突图中有两种有向边,包括顺序边和冲突边;所述顺序边是从一条SQL语句指向同一个事务内的下一条SQL语句;所述冲突边连接两条SQL语句,所连接的两条SQL语句属于不同事务,且访问了同一张表同时其中一条SQL语句对当前表进行修改;所述事务冲突环是事务级别冲突图中的有向环,一个语句级别冲突图通过一个事务冲突环中所有事务的语句构建;所述语句冲突环是语句级别冲突图中的有向环。2.根据权利要求1所述的针对大规模应用程序的数据库死锁诊断方法,其特征在于,所述步骤S1采用:步骤S1.1:设置待测应用程序的单位测试程序、测试所需的输入、应用所使用的数据库状态以及使用动态符合执行引擎提供的接口标记需要符号化的输入;步骤S1.2:将待测应用程序的单元测试程序通过动态符号执行引擎执行,并收集执行记录,包括:事务信息与路径条件;所述事务信息是通过对动态符号执行引擎扩展从而追踪应用程序运行过程中对数据库驱动函数的调用,实现对事务信息的收集;所述收集的事务信息包括事务开始语句、事务读写语句以及事务提交语句;所述路径条件是程序在动态符号执行过程中执行的分支跳转指令的判断条件;符号执行引擎每次执行分支跳转指令时,会记录具体的判断条件。3.根据权利要求1所述的针对大规模应用程序的数据库死锁诊断方法,其特征在于,所述步骤S2采用:为每一个测试的执行记录创建两个相同的实例并根据所有执行记录的实例创建事务级别冲突图。4.根据权利要求1所述的针对大规模应用程序的数据库死锁诊断方法,其特征在于,对语句冲突环进行过滤处理,减少语句冲突环中SQL语句的数量;所述过滤处理包括:对于语句冲突环中的相邻两条边都是顺序边的语句,将与该语句相邻的两个语句用顺序边连接,并从当前语句冲突环中删除该语句,重复触发执行直至没有SQL语句可被删除。5.根据权利要求1所述的针对大规模应用程序的数据库死锁诊断方法,其特征在于,所述步骤S3采用:
步骤S3.1:分别分析冲突边的两条语句可能访问的所有数据库索引以及相关的语句查询条件;步骤S3.2:分别为两条语句推断所有可能申请的数据库锁;步骤S3.3:比较两条语句所有可能申请的数据库锁,如果两条语句可能申请互相冲突的锁,则表示可能产生锁冲突。6.根据权利要求1所述的针对大规模应用程序的数据库死锁诊断方法,其特征在于,所述基于语句冲突环生成相应的死锁判定条件包括:当前语句冲突环路径条件与冲突条件的合取;所述语句冲突环的路径条件包括:语句冲突环所涉及的所有事务的路径条件的合取,一个事务的路径条件是在执行事务中最后一条语句执行前所记录的路径条件;所述语句冲突环的冲突条件包括:语句冲突环上所有冲突边冲突条件的合取,一条冲突边的冲突条件是该冲突边的共同访问条件以及结果集合关联条件的合取;所述冲突边的共同访问条件包括:一条冲突边的共同访问条件表示该结果行的变量应同时满足该冲突边上两条语句的查询结果;所述结果集合关联条件包括:将冲突边上的两条语句的查询结果与事务信息中的变量的具体...

【专利技术属性】
技术研发人员:王肇国仪传威董致远陈海波臧斌宇
申请(专利权)人:上海交通大学
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1