1

我目前有多个实例同时运行的 ac# 控制台应用程序。该应用程序访问数据库中的值并对其进行处理。在处理一行时,它会被标记,以便没有其他实例同时尝试处理它。我的问题是,在程序实例崩溃的情况下,取消标记这些值的有效且优雅的方法是什么?因此,如果一个实例崩溃了,我只想取消标记该程序实例当前正在处理的那些值。

谢谢

4

2 回答 2

1

潜在的解决方案将在很大程度上取决于您如何启动控制台应用程序。

在我们的例子中,应用程序是根据数据库中的配置记录启动的。当这些应用程序之一执行锁定时,它使用数据库配置记录中的主键来执行锁定。

当应用程序启动时,它做的第一件事就是释放它之前锁定的记录上的所有锁。

为了控制所有子进程,我们有一个服务,它使用配置表中的信息来启动进程,然后密切关注它们,当它们失败时重新启动它们。

每个进程还负责将数据库中的状态表更新为上次可用的时间,最大允许延迟为 2 分钟(对于繁重的处理)。系统管理员使用此状态表来监视问题,但它也可用于在给定进程中重复失败的情况下手动释放锁。

如果您没有这样的结构化方法,那么自动解锁记录可能会非常困难,除非您对应用程序性能有一个可靠的配置文件,让您知道任何超过 5 分钟的锁定都是无效的,因为它应该只处理一条记录平均需要 15 秒,最长 2 分钟。

于 2012-07-15T22:48:40.433 回答
0

为了能够处理任何类型的崩溃,即使关闭电源,我也会建议额外为记录添加时间戳,并在一些合理的超时后将记录视为已解锁,即使它们已被标记。

于 2012-07-15T22:41:20.700 回答