2011-03-03 56 views
0

我正在使用preparedStatements从Java J2EE访问SQL Server 2005表。这些罐子被部署在两台服务器上并行运行。 的过程如下:来自两台服务器的同一表上的并发访问

  1. 从事件表中的新的用户事件
  2. 处理它们(发送电子邮件给用户和其他)
  3. 删除从事件表(处理的事件,如果步骤2中未执行选择确定不应删除)

在某些情况下,用户会收到2封电子邮件(每个服务器一封),因为2个选择是在删除语句之前同时执行的。 我没有表格上的管理权限,只需从Java应用程序访问它。

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

+1

您的服务器是集群配置中的两个节点,还是两个同时访问同一数据库的独立应用程序? – 2011-03-03 15:54:20

回答

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()返回客户端名称,但如果您认为它更安全,则可以从客户端应用程序传入主机名。

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

相关问题