2011-08-28 38 views
5

以下是我想在Web應用程序中執行的兩個潛在工作流程。如何處理Web應用程序中的併發更改?

變形例1個

  • 用戶發送請求
  • 服務器讀取數據
  • 服務器修改數據
  • 服務器保存修改後的數據

變形例2:

  • 用戶發送請求
  • 服務器讀取數據
  • 服務器將數據發送給用戶
  • 用戶發送與修改請求
  • 服務器保存修改後的數據

在每種這些情況下,我想知道:確保同時訪問這項服務的標準方法將產生合理的結果? (即任何人的編輯被打一頓,值對應於編輯的某種排序等)

的情況是假設的,但這裏的,我可能會需要在實踐中解決這個問題的一些細節:

  • Web應用程序,但語言不明
  • 可能,使用Web框架
  • 數據存儲是一個SQL關係數據庫
  • 涉及的邏輯過於複雜的查詢例如表達良好值=值+ 1

我覺得我不想嘗試和重新發明輪子在這裏。這些都是衆所周知的解決方案衆所周知的問題。請指教。

謝謝。

回答

0

事情在應用程序層很簡單 - 每個請求都由不同的線程(或進程)提供服務,因此除非您在處理類(服務)中擁有狀態,否則一切都是安全的。

當你到達數據庫時,事情會變得更加複雜 - 即保存狀態。您需要transactions以確保一切正常。

交易有一組屬性 - ACID,即「保證數據庫交易處理可靠」。

+0

謝謝。對於變化1來說,這很好。但是,在沒有交易的情況下,處理這種情況的通常方式是什麼?例如MySQL的MyISAM – Ming

+0

爲了澄清,我想很多論壇軟件都必須處理這類問題。然而,我看到很多人使用MyISAM,它沒有交易。他們的解決方案是什麼? – Ming

+0

你不能可靠地處理它。論壇軟件主要依賴於插入,很少進行併發編輯,因此它不會導致很多問題。 – Bozho

0

如果您在mysql中沒有事務,則可以使用update命令確保數據未被損壞。

UPDATE tableA SET status=2 WHERE status = 1 

如果狀態爲1,那麼只有一個進程得到更新記錄的結果。在下面的代碼中,如果未執行更新(如果沒有要更新的行),則返回-1。

PreparedStatement query; 
query = connection.prepareStatement(s); 
int rows = -1; 
try 
{ 
    rows = query.executeUpdate(); 
    query.close(); 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 
return rows; 
相關問題