簡體   English   中英

如何在Java中實現ACID事務?

[英]How to implement ACID Transaction in Java?

我必須執行2個動作,一個將數據保存到db中,一個將字節保存在文件系統上,我希望這2個動作可以原子執行。 基本上,如果操作1失敗,則整個過程將失敗,如果操作2失敗,則將回滾同一件事和db操作。

public void doAction() {
   this.saveData();
   this.saveFile();
}

如何執行Java中涉及數據庫和文件系統的ACID事務?

總的來說,這是不可能的。

文件系統不是事務性資源(除非您有意識地和有意地使用日志文件系統),即使它們存在,仍要求它們可以在數據庫環境下與db事務一起參與2PC事務。 “外部”事務控制器(可以控制和控制所需的兩階段提交過程)。 您的機會很小。

您可以嘗試自己做各種事情,例如,記錄寫入的任何文件(或文件部分)的預寫狀態日志,但是基本上,您將自己重新創建日志文件系統,除非您完全這樣做並且完全(這不是一件容易的事),您的系統中仍然會有(嚴重)漏洞。

ACID不僅要求在其中一項操作失敗時能夠回滾更改 ,還要求與其他事務隔離 一旦將數據存儲到文件中,其他人就可以看到更改。 在此之前或之后提交數據庫都違反了ACID規則。

但是,您仍然可以找到必須解決的實際問題的解決方案。 例如,通過將文件訪問與數據庫數據同步(例如,存儲文件名以及數據是否准備就緒)。

還可以考慮將數據存儲在Blob中而不是文件中。

另一個更復雜的方法是鎖定文件系統對數據的訪問,因此在寫入事務時,將阻止所有其他事務同時讀取和寫入文件以及相應的數據庫數據 例如,使用一個空的鎖定文件(original-filename.lock),該文件將阻止他人讀取/寫入該文件中的數據。 僅當您與數據庫數據具有1對1的關系並且不執行任何復雜的查詢(鎖定數據時,不應讀取數據)時,此方法才有效。 當然,只有在您可以控制訪問文件或數據庫的所有內容時,它才有效。 它可能不是很有效。 您仍然需要為文件更改實現回滾機制(通常是復制重命名的內容)。

根據您的特定系統,還有其他幾種解決方案或解決方法。 這個問題可能太廣泛了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM