Java 从两台服务器并发访问同一个表

Java 从两台服务器并发访问同一个表,java,sql,sql-server-2005,concurrency,Java,Sql,Sql Server 2005,Concurrency,我正在使用preparedStatements从JavaJ2EE访问SQLServer2005表。jar部署在两台服务器上并并行运行。 程序如下: 从事件表中选择新用户事件 处理它们(向用户和其他用户发送电子邮件) 从事件表中删除已处理的事件(如果未执行步骤2,则确定不应执行删除) 在某些情况下,用户会收到两封电子邮件(每台服务器一封),因为这两封选择在delete语句之前同时执行。 我对表没有管理员权限,只是从java应用程序访问它 如何在第一次选择时锁定表,并在删除后解锁表? 您是否看到了另

我正在使用preparedStatements从JavaJ2EE访问SQLServer2005表。jar部署在两台服务器上并并行运行。 程序如下:

  • 从事件表中选择新用户事件
  • 处理它们(向用户和其他用户发送电子邮件)
  • 从事件表中删除已处理的事件(如果未执行步骤2,则确定不应执行删除)
  • 在某些情况下,用户会收到两封电子邮件(每台服务器一封),因为这两封选择在delete语句之前同时执行。 我对表没有管理员权限,只是从java应用程序访问它

    如何在第一次选择时锁定表,并在删除后解锁表?
    您是否看到了另一种解决方案?

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

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


    我们通常会添加一个时间戳,这样您就可以检查处理项目所用时间过长的服务器。

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