我正在开发一个将驻留在多台机器上的软件。数据库是共享的。我需要每台机器从数据库中获取唯一资源(行)并将其锁定。
我的问题是我该如何处理?因为每台机器读取相同的行,并且可能发生竞争。
基本上我认为它与线程相同,但不同之处在于我不能在它们之间共享共享资源......
这是如何解决的?
谢谢!
我正在开发一个将驻留在多台机器上的软件。数据库是共享的。我需要每台机器从数据库中获取唯一资源(行)并将其锁定。
我的问题是我该如何处理?因为每台机器读取相同的行,并且可能发生竞争。
基本上我认为它与线程相同,但不同之处在于我不能在它们之间共享共享资源......
这是如何解决的?
谢谢!
向该表添加一个附加列,该列可以存储特定于机器的唯一值,例如机器名称Environment.MachineName
。每台机器在第一次读取表时都会用自己的机器名称更新特定的行。通过这样做,您可以确保每一行只能由特定机器更改。
当机器第一次读取资源表时,它将获得第一条没有机器名称的记录。(防止覆盖其他机器已锁定的行)。
并且它将使用其机器名称更新该行的唯一列。
每当机器想要更新一行时,检查该行的机器名称和请求的机器是否相同。
完成所有操作后,从特定行清除机器名称(释放资源)。
所有严肃的数据库系统都有锁定行和/或表的机制。在您自己实施一些自制锁定之前,请检查您的 DBMS 已经带来了什么。
您没有提及您使用的 DBMS,因此您必须自己进行谷歌搜索。从“数据库锁”开始,看看它会把你带到哪里。
我有一个类似的问题,我通过在数据库级别编写自己的锁定过程来解决。
基本上,我添加了一个名为“SessionLock”的列,它是一个 GUID。
每当我进行需要锁定的数据库调用时,我都会使用存储过程来模拟测试和设置(如果 SessionLock 不为空,我使用更新并检查返回的行是否等于我请求的行数锁定)。然后我在行上执行一些工作并在完成后解锁它们。
现在数据库本身有自己的锁定,所以你可能不需要这么复杂。但是这样你就可以完全控制行。