2012-06-10 40 views
0

我有存儲在磁盤上,可以是一個Web場中跨多個服務器訪問的文件。根據需要根據數據庫中的數據更改更新此文件。我有一個數據庫表,它存儲了一個包含該文件的URI的行,以及一些基於某些數據庫表的散列。如果散列不匹配它們各自的表,那麼文件需要重新生成並且需要插入一個新行。如何只允許一個更新/插入到表,如果行是過時的

如何讓這個只有1個客戶端重新生成此文件,並插入行?

(因爲鎖)最簡單的,但最糟糕的解決方案是:

BEGIN TRANSACTION 
SELECT ROW FROM TABLE (lock the table for the remainder of the transaction) 
IF ROW IS OUT OF DATE: 
    REGENERATE FILE 
    INSERT ROW INTO TABLE 
DO SOME STUFF WITH FILE (30s) 
COMMIT TRANSACTION 

但是,如果多個客戶端執行此代碼,所有後續的客戶坐了很長一段時間,而「做一些東西WITH FILE「進程。

有沒有更好的方法來處理這個問題?也許改變我在提交之前處理文件的方式以使其更快?我被困在這幾天。

+0

IM觸發器中沒有專家,但可能由於你所提到的文件反映了數據庫中的數據,所以它再生每次他們將是有益的4U –

回答

1

答案取決於文件級處理的細節。

如果你只是交換數據庫和文件操作,你的風險的文件或忙等待的腐敗(取決於你究竟是如何打開它,什麼時候併發打開被拒絕你的代碼一樣)。忙於等待肯定會比從吞吐量(或任何其他)角度等待數據庫鎖定更糟糕。

如果您的文件處理確實需要很長時間才能成爲導致請求排隊,唯一的解決方案是添加更強大的硬件或優化文件級別處理。

例如,如果該文件只反映了數據庫中的數據,你可能會逃脫不更新它在所有,並具有後臺進程基於數據庫中的數據定期重新生成的內容。您可能需要添加版本是可以確保無論誰讀取該文件沒有收到過期數據。如果該文件指向的URL有一個新的名字每一次,你可能需要一個錯誤處理程序,確保了GET請求不被接受習慣的新文件404響應。

+0

我實際上使用一個數據庫行作爲一種版本管理系統來跟蹤文件的狀態,最後我確定文件處理完成時間不會太長。對這一行的請求是足夠低的,鎖定1-2秒(固定處理部分之後)不是什麼大問題在數據庫中不會經常更改,所以文件不會經常更新。我受應用程序設計的限制,所以我可能會堅持這一點。 –

2

這聽起來像你需要異步做你的文件處理,因此該文件過程中剝離出來,並及時將交易完成。有幾個方法可以做到這一點,但最簡單的可能是與該表中更新每個記錄「記錄插入表This_File_Needs_To_Be_Updated,然後運行一個作業,每隔幾分鐘,以取代「做的東西有文件」,或者HERE是一些代碼,生成的飛行作業,或者看堆棧溢出THIS問題。

+0

實際執行數據庫操作的代碼部分偶爾會發生,因此異步操作可能不會使我受益。對不起,我應該在我的僞代碼中更具體。「重新生成的文件」不會經常出現足以打擾異步操作的情況。我能夠減少「使用文件做某些事情」的執行時間,以保留當前的鎖定方案。如果應用程序設計更好或者有更好的方法來實現它,我會,但是這種當前的解決方案應該足夠適用於這種情況。感謝您的輸入。 –

相關問題