Board logo

标题: [V12功能解说] 清除APLLCK表中的死锁记录 [打印本页]

作者: anne.yao    时间: 2024-5-30 16:51     标题: [V12功能解说] 清除APLLCK表中的死锁记录

本帖最后由 anne.yao 于 2024-5-30 16:53 编辑

* 本文由赛捷软件(上海)有限公司翻译完成,未经授权不得转载。如需转载,请先联系相应版块的版主取得授权。


Sage X3--操作指南

清除APLLCK表中的死锁记录




众所周知,APLLCK表会累积并保留锁定记录,即使用户已经结束了会话。以下查询显示了调查记录的步骤,最后的语句提供了清除旧的“死锁”记录的可靠方法。


--所有锁符号列表
SELECT * FROM x3.LIVE.APLLCK ORDER BY LCKDAT_0 DESC, LCKSYM_0;


问题是,该列表包括了不再登录的用户的锁定记录。如果要查看当前已登录用户的列表,请转到:

开发-工具-检验-系统监控-用户




通过运行SQL追踪,可以重现用户列表(但必须以系统管理员登录),请运行以下查询:


--所有用户会话列表
SELECT X3SM0.SESSIONID_0, X3SM0.FOLD_0, X3SM0.LAN_0, X3SM0.SOLUTION_0, X3SM0.SESSIONTYPE_0, X3SM0.REMOTE_0, X3SM0.PEER_0, X3SM0.SYSTEMUSER_0, X3SM0.NATURE_0,
X3SM0.ALOGIN_0, X3SM0.PROCESSADX_0, X3SM0.UPDUSR_0, X3SM0.CREDATTIM_0
from x3.X3.ASYSSMDBASSO X3SM1 Join x3.X3.ASYSSMINTERN X3SM0 on X3SM1.SESSIONID_0 =
X3SM0.SESSIONID_0 Join sys.dm_exec_connections VDS On VDS.session_id = convert(integer, X3SM1.DBIDENT1_0) and VDS.connect_time = convert( datetime, X3SM1.DBIDENT2_0, 121) order by X3SM0.ALOGIN_0, X3SM0.PEER_0, FOLD_0;



如果导航到开发-工具-检验-锁定-被锁定标记,则会看到锁定记录的简短列表。
导出上述查询并进行仔细检查后会发现,X3用户界面实际上在APLLCK表和当前登录用户列表之间执行了内连接。实际上,X3会忽略不再登录的会话的APLLCK条目。为了简化检查锁定与登录用户,请运行下面的查询,注意它和从“锁定-被锁定标记”中查出的结果相同。



--用户会话确实存在的所有锁定记录列表(即有效锁定)
SELECT * FROM x3.LIVE.APLLCK WHERE LCKPID_0 IN (SELECT X3SM0.SESSIONID_0 FROM x3.X3.ASYSSMDBASSO X3SM1 JOIN x3.X3.ASYSSMINTERN X3SM0 ON X3SM1.SESSIONID_0 =
X3SM0.SESSIONID_0 JOIN sys.dm_exec_connections VDS On VDS.session_id = convert(integer, X3SM1.DBIDENT1_0) AND VDS.connect_time = convert(datetime, X3SM1.DBIDENT2_0, 121 )) ORDER BY LCKDAT_0 DESC, LCKSYM_0;



这样做的好处是,我们还可以可靠地显示不再有效的锁列表:
--用户会话不存在的所有锁定记录列表(理论上,这些锁定应该是无效锁定)

SELECT * FROM x3.LIVE.APLLCK WHERE LCKPID_0 NOT IN (SELECT X3SM0.SESSIONID_0 FROM x3.X3.ASYSSMDBASSO X3SM1 JOIN x3.X3.ASYSSMINTERN X3SM0 ON X3SM1.SESSIONID_0 =
X3SM0.SESSIONID_0 JOIN sys.dm_exec_connections VDS On VDS.session_id = convert(integer, X3SM1.DBIDENT1_0) AND VDS.connect_time = convert(datetime, X3SM1.DBIDENT2_0, 121 )) ORDER BY LCKDAT_0 DESC, LCKSYM_0;



因此,可以执行以下语句来清除APLLCK表中的无效锁定。

DELETE FROM x3.LIVE.APLLCK WHERE LCKPID_0 NOT IN (SELECT X3SM0.SESSIONID_0 FROM x3.X3.ASYSSMDBASSO X3SM1 JOIN x3.X3.ASYSSMINTERN X3SM0 ON X3SM1.SESSIONID_0 =
X3SM0.SESSIONID_0 JOIN sys.dm_exec_connections VDS ON VDS.session_id = convert(integer, X3SM1.DBIDENT1_0) AND VDS.connect_time = convert( datetime, X3SM1.DBIDENT2_0, 121));


如果您愿意,可以将最后的删除语句设置为SQL作业,每周或每晚执行一次,这将有助于保持APLLCK表更加整洁。一般来说,失效的APLLCK条目不会对系统使用产生实际影响,但如果您喜欢保持一切整洁,那么这可能适合您。


注意——如果运行的是Datalinx,则可能需要重新检查锁定的管理方式。




欢迎光临 赛捷软件论坛 (http://sagesoft.cn/bbs/) Powered by Discuz! 7.2