处理winform应用程序中的意外事件

时间:2012-09-14 15:37:34

标签: c# .net winforms sql-server-2008

我在.net 4.0中开发了win-form个应用程序,并使用SQL 2008作为DBMS

用户可以从项目列表中打开项目,每次打开时,我都会使用 userId 更新数据库,以说明特定项目是由特定项目打开的用户,以便其他用户无法同时打开同一个项目。此外,当用户关闭项目时,我将其重置为正常,其他人可以打开。

但我想知道如果某些系统崩溃/卡住或类似的情况下如何更新数据库。处理这些情况有什么好的解决方案吗?

3 个答案:

答案 0 :(得分:2)

一种解决方案是在数据表中添加时间戳列。每次用户访问项目(除了其他工作),您都可以设置此时间戳值。

然后,您可以拥有一个单独的任务/服务,它会迭代思考记录,并偶尔释放任何过期的锁。

答案 1 :(得分:1)

因此,您正在尝试实施自己的locking机制。了解如何缓解应该给您一个想法的Deadlocking问题。基本上,您使用通知或戳记来跟踪锁的所有者状态(如果它已经死亡或仍在使用资源),阻止resource starvation

请求的示例

有2个用户。用户A和用户B.

用户A在您的应用中打开一个视图,然后发生两件事:

  • 您更新数据库并将标记设置为当前时间。
  • 你开始一个新的后台线程,他将负责保护锁。此后台线程必须等待N-Delta,其中N是资源可以锁定而不续订的最大分钟数,delta是更新时间的增量。因此,例如,假设一个视图可以在没有用户活动的情况下锁定最多15分钟,那么你的线程必须等待15-1(这可能需要1分钟才能通知DB“这次更好的警告”)。

然后,用户B尝试访问该视图,检查数据库中的资源和锁定表,如果该视图的锁定时间不超过15分钟,则拒绝访问。但是,如果时间超过15分钟,则授予对用户B的访问权限并从用户A中删除访问权限。

如果用户A或用户B成功关闭了视图,则只需从数据库中删除入口即可。

这是一个非常简单的例子,但应该让你知道我的意思。

答案 2 :(得分:0)

我以前遇到过类似的情况。在这种情况下,您将不得不假设用户在该项目上采取行动的最长时间(比如15分钟)。创建一个名为item_lock的表,其中包含2列:item_id,lock_aquired_time。每次用户点击任何项目时,都会在此表中插入一条记录。如果任何其他用户试图打开该项目,则会在其屏幕上弹出一条通知,表明该资源已被锁定,以便XYZ采取行动。此外,您需要创建一个服务,每分钟运行一次,并删除任何超过15分钟的记录 PS:每当任何用户对任何项目完成操作时......该行将从item_lock表中删除。