从两台服务器同时访问同一个表

时间:2011-03-03 15:50:41

标签: java sql sql-server-2005 concurrency

我正在使用preparedStatements从java J2EE访问SQL Server 2005表。这些jar部署在两台服务器上并行运行。 过程如下:

  1. 从事件表中选择新用户事件
  2. 处理它们(向用户和其他人发送电子邮件)
  3. 从事件表中删除已处理的事件(如果未执行第2步,则不应执行删除)
  4. 在某些情况下,用户会收到2封电子邮件(每封服务器一封),因为在删除声明之前同时执行了2次选择。 我没有表的管理员权限,只是从java应用程序访问它。

    如何在第一次选择时锁定表并在删除后将其解锁? 你看到了另一种解决方案吗?

1 个答案:

答案 0 :(得分:2)

如果您以事务方式工作,只有一台服务器可以选择它:

set transaction isolation level repeatable read

update  top 1 tbl
set     ProcessingOnServer = HOST_NAME()
from    YourWorkTable tbl
where   ProcessingOnServer is null
        and Done = 0

现在您可以选择详细信息,知道工作项已安全地分配给您:

select  *
from    YourWorkTable tbl
where   ProcessingOnServer = HOST_NAME()
        and Done = 0

函数host_name()返回客户端名称,但如果您认为它更安全,则可以从客户端应用程序传入主机名。

我们通常会添加时间戳,因此您可以检查处理项目花费时间过长的服务器。