2017-04-25 44 views
0

我有一個與數據庫表的工作原理是 Id, state, procdate, result提交更改與鎖定保持

當有需要處理一些數據的應用程序,應用程序設置狀態PROCESSING。處理後的處理結果被設置爲result列,狀態變爲STANDBY

要做的第一個設置爲PROCESSING我開始交易,做select for update,然後更新狀態和procdate。 然後我做了工作,並使用selection for update更新狀態和結果。

處理可能需要長達5分鐘。需要進行狀態切換以查看有多少行正在進行。問題是可能會發生另一個處理請求,並且必須等到第一次處理結束。 所以我想保持行鎖定。如果我在提交處理狀態之後將選擇更新爲鎖定,則第二個請求可能會攔截並鎖定該行。

那麼我怎樣才能保持鎖定並提交更改?

+0

你不能那樣做。也許你需要重新考慮你的設計? – OldProgrammer

+0

很傷心。也許我需要。但我不知道如何。任何書籍或文章或會議視頻? – fantomasdnb

回答

0

你需要用你的設計來處理這個問題。這是一個想法。

  1. 您記錄最初有一個狀態,說'READY',並且處理ID最初爲null。
  2. 當您開始時,將狀態更新爲'PROCESSING',並將id更新爲作業運行的值,這可以來自Oracle內部的一個序列,以便它對您的過程運行是唯一的。承諾。
  3. 該進程運行時使用相同的id,並選擇狀態'PROCESSING'並且與其定義的處理ID相同。完成處理,將狀態更新爲'COMPLETE'(或'STANDBY')。承諾。

這允許第二個進程選擇新的'READY'記錄並將它們設置爲自己的處理,而不會干擾已經運行的進程。