2013-02-22 57 views
0

我正在用java開發計費軟件。在我的應用程序中,用戶打開創建發票的窗口。在多臺計算機上處​​理髮票號碼

當窗口打開時它去抓取的MaxID和返回從INVOICElongMaxID+1並將其顯示在一個Jlabel。現在當用戶每次開始記帳時,發票號碼將是MaxID+1。該系統在單用戶應用程序中運行良好。

但是,當這個應用程序運行在多臺計算機上會發生很大的問題。當兩個用戶,例如userOneuserTwo同時打開同一個窗口時,他們將獲得相同的MaxID+1。結果他們兩人將在相同的發票號碼中輸入數據。我該如何解決這個問題?

請幫忙。

+1

也有沒有任何理由你沒有使用數據庫本身的自動增量列? – 2013-02-22 12:16:32

+0

自動增量在這裏不起作用,因爲MaxID + 1對於多行是相同的。這是發票ID。一張發票可以有多個項目。 – 2013-02-22 14:04:54

回答

1

比賽條件的經典場景。您需要將訪問權限同步到MaxId。根據您的數據庫,您需要在訪問MaxId之前鎖定Invoice表,並在檢索完成後解鎖它。 MaxId的檢索必須是原子的。

+2

可能最好在存儲過程中對數據庫執行同步操作,然後執行MaxID + 1更新並返回值,然後讓您的應用程序調用以獲取下一個ID。這允許應用程序的完全獨立的實例共存。 – BruteForce 2013-02-22 12:19:39