2012-03-14 20 views
0

我的數據庫引擎通過發出整個磁盤塊的寫()系統調用寫入的64個字節記錄。該設備以O_DIRECT模式打開。例如,當我執行UPDATE整個磁盤塊(默認512字節)時,塊中的第三條記錄從字節128開始,到位置192結束。是寫入()與O_DIRECT ACID兼容?

我的問題是,我可以calim符合ACID,如果我寫的每一次更新發生在自己的記錄?通常,數據庫引擎通過將修改後的磁盤塊寫入另一個(空閒)位置,然後在第一次寫入返回成功後立即使用一個(原子)寫入更新索引到新塊來執行此操作。但我沒有這樣做,我正在用當前數據覆蓋當前數據,希望寫入成功。我的方法是否有任何潛在的問題?它是否符合ACID標準?如果硬件只寫入塊的一半而我的記錄正好在中間呢?還是硬件已經完成了我描述的2步寫入過程,但是在塊級別,所以我不需要在軟件中重複相同的操作?

(注:不記錄比物理磁盤塊(512個字節默認)和FSYNC較大的去每次寫(後),這是僅適用於Linux)

+0

可能重複[磁盤扇區寫入原子?](http://stackoverflow.com/questions/2009063/are-disk-sector-writes-atomic) – Nemo 2012-03-16 01:56:01

+0

http://www.qnx.com/developers/ docs/6.4.0/neutrino/sys_arch/fsys.html#QNX6_filesystem – 2012-04-03 16:39:43

回答

0

ACID預測故障,並建議如何應對他們。兩階段提交和三階段提交是兩個相當普遍且很好理解的方法。

雖然我是一個數據庫的傢伙,在DBMS釋放我不必去想這種事情非常多。但我認爲在不採取任何其他預防措施的情況下覆蓋記錄可能會使「C」和「D」屬性(「一致」和「持久」)失效。

要建立真正的好代碼,假設你的DBMS服務器沒有電池備份緩存,只有一個電源,以及交易過程中有一個在一個電源出現災難性故障。如果你的dbms可以相當乾淨地應對這種失敗,我認爲你可以稱之爲符合ACID。

後來。 。 。

我讀特威迪的成績單。他不是在談論數據庫直接訪問磁盤;他正在談論日誌文件系統。日誌文件系統也執行兩階段提交。

這聽起來像你想達到符合ACID(數據庫中的意義上)具有單階段提交。我認爲你不能逃避這一點。

Opening with O_DIRECT意思是「嘗試以最大限度地減少I/O對此文件的緩存效果」(強調增加)。我認爲你還需要O_SYNC。 (但是,鏈接的內核文檔告誡說,大多數Linux文件系統不實現POSIX語義的O_SYNC,並且文件系統和磁盤都知道是否寫入了拼盤。)

還有兩個注意事項內核文檔。首先,「建議應用程序將O_DIRECT用作默認禁用的性能選項。」你沒有那樣做。您正在嘗試使用它來實現ACID合規性。

其次,

「這一直打擾我關於O_DIRECT的事情是,在整個 接口僅僅是愚蠢的,並可能是通過對一些嚴重的心靈控制物質 瘋狂的猴子設計。「 - 萊納斯

SQLite的對他們如何處理原子提交一個可讀的文件Atomic Commit in SQLite

+0

我想過你說什麼,但即使在兩階段提交中,當你開始將請求寫入事務日誌文件時,如何確保寫入日誌文件已完成?例如,您的事務是64字節,您向磁盤發送了write(),然後電源關閉。該磁盤已寫入33個字節。當電源回退並且您讀取了該扇區時,您如何知道剩餘的31個字節是否被寫入? – Nulik 2012-03-15 01:59:54

+0

@Nulik:如果出現故障,重新啓動過程將在協調員日誌中查找決策記錄。如果找到了,處理會從停止的地方恢復。如果不是,則假定回滾。 Date在他的*數據庫系統簡介*中有詳細的主題。你也可以閱讀[PostgreSQL源代碼](http://doxygen.postgresql.org/)。 – 2012-03-15 02:14:08

+0

嗯,我實際上找到了問題的答案。磁盤扇區寫入似乎是原子,如在這裏回答:http://stackoverflow.com/questions/2009063/are-disk-sector-writes-atomic,因爲我寫單個部門,我不應該擔心,除非我有一些非常舊的硬件 – Nulik 2012-03-15 02:51:39

0

你不能假設的磁盤寫操作將是成功的,你不能假設磁盤。將會保留現有的數據Here is some QNX documentation also stating this.

如果你確實真的很不走運,寫入磁盤時會失敗,導致寫入數據時出現校驗和和半寫入數據錯誤。

這就是ACID系統至少使用兩個數據副本的原因。

+0

根據[較早的SO答案](http://stackoverflow.com/questions/2009063/are-disk-sector-writes-atomic),你是錯的,至少對於一些(所有)磁盤......即使斷電,也能保證原子單扇區寫入。 – Nemo 2012-03-16 01:57:04

+0

@Nemo:我從個人經驗中瞭解到,在發生電源故障事件後,硬盤會出現壞道。也許服務器驅動器保證它。西部數據綠色驅動器不。 – 2012-03-16 08:23:20