2011-06-17 21 views
0

我需要實現一些原子寫入輔助存儲。我怎樣才能做出這個傻瓜證明?fs.write(); fs.flush();它何時真的寫入磁盤?如果核心恐慌或停電怎麼辦?

如果我使用File.Open打開一個C#文件句柄,我將收到一個句柄。我可以寫一些數據給它。沖洗並關閉它。但我仍然有一些問題。我猜下面的陳述是真的嗎?

  • 數據可能不會寫入到磁盤,但在Windows磁盤高速緩存,而存在

  • 數據可能不會寫入到磁盤,但在HDD緩存而存在

這將導致以下問題:

  • 停電會使編輯我做了回覆的文件(在交易FS像NTFS)

  • 內核恐慌將使編輯我做了回覆的文件中(在交易FS像NTFS)

我是正確在我的假設?如果是這樣,我該如何做一個傻瓜證明寫入磁盤? 我已經看了一下NoSQL,並一直認爲可能會有一個nosql服務器可以與系統接近,而不是返回給我軟件,直到它可以保證字節寫入磁盤。

所有的意見和想法,歡迎

[編輯] 也許有時間我可以是確保所有更改寫入物理磁盤之前,等待具體金額是多少?

回答

0

我不是Windows內部專家,但我相信你是正確的。我沒有詳細測試它,但能夠使用MSMQ作爲一個非常可靠的地方來存儲數據,另一個進程監視隊列以進行最終處理。

1

使操作完全「防呆」的唯一方法是排隊,運行操作並確認。東西保持隊列並可以再次運行,直到確認,或者如果確認消極「回滾」。

假設你沒有涉及網絡(一切都是本地的),你所談論的時間窗口非常小。不過,如果你想確保事情,你排隊。 MSMQ是一種選擇。如果數據來自SQL Server,則可以將其視爲排隊機制Service Broker(不建議這個方向,但它是一種方法)。

最終,這裏的想法很像握手,就像大多數服務器到服務器通信一樣。在雙方擺脫他們的工作之前,每個人都認爲事情已經完成。

+0

值得注意的是,MSMQ有4MB的限制 - 所以你會限制排隊文件的大小。 –

+0

如果你正在談論大量的數據,你可能會得到一個自定義隊列。 –

+0

你確定嗎? MSMQ會起作用嗎? MSMQ做什麼神奇的事情,我不能在C#本身做?我寧願不使用MSMQ,因爲我從早期的項目中獲得了很糟糕的經驗。在虛擬環境中速度非常慢,我需要一些可以保持排序的東西。 –