2012-12-22 70 views
1

我有一個數據庫表,記錄其他表中發生的更改。我的日誌表的表結構如下。以正確的方式執行jdbc事務

Log_Table(id, table_name, operation, flag) 
    values (1, Customer_Table, 1,  1); 
    values (2, Customer_Table, 2,  1); 
    values (3, Customer_Table, 1,  1); 
    values (4, Customer_Table, 2,  1); 
    values (5, Customer_Table, 1,  1); 

我做以下操作更新對網頁上的按鈕,這個表:

/* first */ 
public List<Long> select_Changes() 
{ 
    select id from Log_Table where flag =1; 
} 

/* (wait for user input) */ 

/* second */ 
public void update_table(List<Long> ids) 
{ 
    update Log_Table set flag =0 where id in(ids) 
} 

問題是,第一和第二操作之間的由用戶進行操作。同時另一個用戶同時進行相同的操作。我不希望第一個用戶已經選擇的行被第二個用戶選中;也就是說,當第二用戶運行的第一個步驟(假設兩個行,因爲第一個用戶運行它已添加),結果應該是:

values(6,Customer,2,1); 
    values(7,Customer,1,1); 

請建議我應該怎麼辦呢?在選中行後,我需要鎖定行以進行任何操作。我嘗試選擇更新子句,但它沒有解決問題。它在一個Web應用程序中。

回答

1

在等待用戶輸入時保持數據庫事務處於打開狀態幾乎不是一個好主意。如果用戶在交易未決時進行午餐,或者他們的網絡連接斷開並且幾天沒有恢復,該怎麼辦?

此外,你不說你正在使用什麼數據庫產品。根據產品,配置和事務隔離級別,併發嘗試交易未決的結果,因此如果您想要便攜式行爲,則不能依賴SELECT FOR UPDATE或更多標準化功能的行爲。

我的建議是在行中提供一種方法來識別正在等待用戶確認的待處理行。您可以使用flag列的三個狀態來表示類似available,pendingtaken;不過,您可能想要一些方法來識別呈現給用戶的行,但用戶從未單擊「確定」或「取消」(或任何選項)的行。如果您爲目的添加時間戳列,你可以留在兩種狀態的flag列,並使用這樣的(假設您正在使用的支持RETURNING條款數據庫)的第一步:

public List<Long> select_Changes() 
{ 
    UPDATE Log_Table 
     SET when_presented = CURRENT_TIMESTAMP 
     WHERE flag = 1 
     AND when_presented = NULL 
     RETURNING id, when_presented; 
} 

第二步將被更改爲:

public void update_table(List<Long> ids) 
{ 
    UPDATE Log_Table 
     SET flag = 0 
     WHERE id IN (ids) 
     AND when_presented = time_claimed; 
} 

第二步不會一定需要改變,但與上面的變化,你可以使用另一個RETURNING條款,以確認其id值這個用戶實際上聲稱,如果維護過程將when_presented設置回NULL上,顯然被放棄的一組行在第一個用戶遲到之前就被提出給另一個用戶,然後遲遲不會提出要求,那麼這個用戶就會結束競爭條件。

+0

我添加了一個時間戳列和一個額外的表結構 Last_Oeration_Time(ID號,時間:LAST_TIMEBREAK時間戳(6)) – bilalhaider

0

我加了時間戳列和一個額外的表與該結構

Last_Oeration_Time(id number, last_op_time timestamp(6)) 

當第一用戶點擊按鈕i運行像 插入INT Last_Oeration_Time(ID,last_op_time)值上Last_Oeration_Time一個SQL插入查詢(seq_lasst_op_time_id。NEXTVAL,SYSDATE)

現在當第二用戶運行的第一步(假定由於第一用戶運行它兩個行已被添加),其結果是所需的結果。這個可以嗎?

+0

這確實應該是我的回答一個更大的評論,或對問題的編輯。這是否能夠可靠地工作或是否存在競爭條件取決於問題中未指定的事情。 – kgrittn

+0

@kgrittn yes同意這應該是一個更大的評論你的答案。通過這種方式,我的工作正常......這個解決方案對我有好處嗎?實際上,我發佈它的評論,但它不允許我,所以我張貼它作爲我的答案我origionaly有你的想法實施。 – bilalhaider

+0

就像我說的,沒有更多的細節,我不可能確定是否有剩餘的競賽條件。在使用單獨的表格時,您*可能*仍然留下一個小問題窗口。它取決於特定的數據庫產品及其配置。 – kgrittn

相關問題