考慮Spring MVC
的Java Web應用程序,它提供了一些REST API
。防止REST客戶
假設它有很多方法,其中之一是DELETE /api/foo/{id}
,它顯然從數據庫中刪除foo
實體,給定的id
。
的問題是,由於DB大數據,這個操作不是即時的,因此,如果客戶端嘗試同時執行多重刪除同一實體操作,說
DELETE /api/foo/123
X N次(錯誤地在客戶端軟件當然),
,它引起了一些DB令人不快的副作用(你知道,如果你嘗試在幾個交易刪除同一實體,這不是一般的好看)。
我的問題是:什麼是Spring MVC
的最佳實踐,以防止這樣的情況呢?
我當然可以在每個這樣的更新方法(PUT/DELETE
)中引入Foo
id的同步。我將需要爲所有實體和所有PUT/DELETE
API方法做到這一點,但我真的不想這樣做。我想這應該是一些優雅而又不錯的解決方案,如何在攔截器/ servlet級別上執行這種類型的同步,即不在控制器級別的服務上。
我還可以創建特定的攔截器,並執行那裏等着重複請求(有相同的URL和參數請求)。但是,這聽起來並不是一個優雅的解決方案(直到我將確保無法以更美觀的方式在Spring MVC
中進行配置)。
原則上,交易機制是爲此目的而設計的。你有什麼進一步的要求,你認爲事務回滾爲DB **中令人不快的副作用? –
是的,問題是不同的數據庫對於這種事件有不同的行爲。在我的情況下,由於複雜的複製結構,我得到了某種阻塞。我通常不想從數據庫中接收和接收任何類似的例外情況,我想阻止他們的出現。 – Andremoniy
我對或錯。我不知道根據我的知識,我們可以做一件事情,只是檢查數據可用的數據庫或不像getFooById(ID);如果你得到的數據比你可以刪除相同的數據,否則你可以拋出異常,數據不存在 –