2011-03-03 58 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()返回客戶端名稱,但如果您認爲它更安全,則可以從客戶端應用程序傳入主機名。

我們通常會添加一個時間戳,以便您可以檢查花費太長時間處理項目的服務器。

相關問題