2013-08-31 30 views
0

我正在开发将驻留在多台计算机上的软件。数据库是共享的。 我需要每台机器从数据库中获取一个唯一的资源(行)并锁定它。如何锁定计算机之间的共享数据库资源

我的问题是我该如何照顾?因为每台机器读取相同的行,并可能发生竞争。

基本上我认为它一样的线程,但不同的是,我不能分享它们之间的共享资源......

这是怎么解决的?

谢谢!

+0

你是什么意思通过锁定行?只有相关的机器才可以修改它? – Kurubaran

+0

是的。我想要一台机器“捕获”该行,做一些工作,但机器不能在该行上工作 – Himberjack

+0

为什么要首先锁定机制?你有没有考虑过使用交易?你可能会发现这个链接有用http://technet.microsoft.com/en-us/library/aa213039%28v=sql.80%29.aspx –

回答

0

我有一个类似的问题,我通过在数据库级别编写自己的锁定程序来解决这个问题。

基本上我添加了一个名为“SessionLock”的列,它是一个GUID。

每当我做一个需要锁定的数据库调用时,我使用存储过程来模拟测试和设置(如果SessionLock不为空,我使用更新,并检查返回的行是否等于行的数量我要求被锁定)。然后,我在行上执行一些工作,并在完成后解锁它们。

现在数据库本身有自己的锁定,所以你可能不需要这么多的复杂性。但是这样你可以完全控制行。

0

在该表中添加一个可以存储机器特定唯一值的附加列,例如机器名称Environment.MachineName。每台机器在第一次读取表格时都会使用自己的机器名称更新特定的行。通过这样做,你可以确保每行只能被特定的机器改变。

  • 当第一次机器阅读资源表,它会得到 这可是没有一台机器名称的第一个记录。 (防止从 过度排其他机器已锁定)。

  • 它会更新该行的唯一列及其机器名称。

  • 每当一台机器想要更新一行时,请检查该行和请求的机器的机器名称是否相同 。

  • 所有操作完成后,清除机器名称 特定行(释放资源)。

+0

但是,我承诺他们不会互相重叠? – Himberjack

+0

你是什么意思,通过压倒对方?你能详细说明你的要求吗? – Kurubaran

+0

我有固定的“资源”。每个资源都是数据库中的一行,每台机器都可以捕获,管理和释放。但我不能有2台机器在同一资源上工作。因此我需要以某种方式锁定它 – Himberjack

0

所有严重的数据库系统都有锁定行和/或表的机制。在你自己实现一些homebrewn锁之前,看看你的DBMS已经带来了什么。

你没有提到你使用的DBMS,所以你将不得不自己使用Google搜索。 以“数据库锁”开头,看看它会带你到哪里。

+0

MSSQL .......... – Himberjack