我有一个应用程序,需要运行一个任务的单个实例。为了检查任务的当前实例是否已在运行,我检查任务的状态。如果任务具有一个或多个这些状态的组合,则它知道任务已在运行,并且应该暂时跳过该任务。这些任务可以从多个地方调用,因此我可以在一分钟内完成一百个左右的任务调用。
我在Oracle 11g上有以下查询。
SQL:
INSERT INTO Log2 (LogID, Action, EventDateTime)
SELECT 102211, 2, SYSDATE FROM dual WHERE NOT EXISTS
(SELECT LogID FROM Log2 T3 WHERE T3.Param2 = 102 AND T3.Action = 34 AND T3.AuditLogID NOT IN
(SELECT T2.LogID FROM Log2 T1, Log2 T2 WHERE (T1.Action IN (1,2,3) AND T2.Action = 6 AND T1.Param3=T2.Param3 AND T1.Param2 = 102))
);
目前上述查询有时会同时插入2条记录(eventDateTime告诉我)。我怎样才能确保不会发生这种情况?我需要添加一些锁定提示吗?我认为整个查询都是原子的。 JDBC连接处于自动提交状态。 应用程序的几个部分更新了此表。我只希望对上述任务项进行此锁定。将记录添加到此Log2表的应用程序的其他部分一次只插入一条记录,因此这些其他部分不需要此单实例行为。
由于