我在.net 4.0中开发了win-form
个应用程序,并使用SQL 2008
作为DBMS
。
用户可以从项目列表中打开项目,每次打开时,我都会使用 userId 更新数据库,以说明特定项目是由特定项目打开的用户,以便其他用户无法同时打开同一个项目。此外,当用户关闭项目时,我将其重置为正常,其他人可以打开。
但我想知道如果某些系统崩溃/卡住或类似的情况下如何更新数据库。处理这些情况有什么好的解决方案吗?
答案 0 :(得分:2)
一种解决方案是在数据表中添加时间戳列。每次用户访问项目(除了其他工作),您都可以设置此时间戳值。
然后,您可以拥有一个单独的任务/服务,它会迭代思考记录,并偶尔释放任何过期的锁。
答案 1 :(得分:1)
因此,您正在尝试实施自己的locking机制。了解如何缓解应该给您一个想法的Deadlocking问题。基本上,您使用通知或戳记来跟踪锁的所有者状态(如果它已经死亡或仍在使用资源),阻止resource starvation。
请求的示例
有2个用户。用户A和用户B.
用户A在您的应用中打开一个视图,然后发生两件事:
然后,用户B尝试访问该视图,检查数据库中的资源和锁定表,如果该视图的锁定时间不超过15分钟,则拒绝访问。但是,如果时间超过15分钟,则授予对用户B的访问权限并从用户A中删除访问权限。
如果用户A或用户B成功关闭了视图,则只需从数据库中删除入口即可。
这是一个非常简单的例子,但应该让你知道我的意思。
答案 2 :(得分:0)
我以前遇到过类似的情况。在这种情况下,您将不得不假设用户在该项目上采取行动的最长时间(比如15分钟)。创建一个名为item_lock的表,其中包含2列:item_id,lock_aquired_time。每次用户点击任何项目时,都会在此表中插入一条记录。如果任何其他用户试图打开该项目,则会在其屏幕上弹出一条通知,表明该资源已被锁定,以便XYZ采取行动。此外,您需要创建一个服务,每分钟运行一次,并删除任何超过15分钟的记录 PS:每当任何用户对任何项目完成操作时......该行将从item_lock表中删除。