--用户会话确实存在的所有锁定记录列表(即有效锁定)
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));