假設我們有一些配置GUI,它以當前形式使用直接DB事務以一致的方式爲多個可配置組件提交新配置。從SOAP/WS-API更新/寫入調用中分離GUI的好方法?
現在讓我們把數據(DB)的東西移到一些SOAP/WS API的後面。 GUI不再有直接的數據庫訪問。交易行爲必須保持,但API應該設計爲明確地適應GUI表單提交。事實上,我甚至不知道新的GUI將如何工作,或者用戶輸入的結構如何。因此我需要在API服務器端提供類似WS-AtomicTransaction的東西。但是,(至少)有兩個注意事項:
- GUI是用PHP編寫的:我不認爲在PHP中有任何WS-Transaction支持可用。
- 我不想在等待其他客戶端請求的同時在服務器端打開數據庫事務。
解決方案,我能想到的:
- 使用Camel's aggregation。但是,這會使事情至少在兩個方面變得更加複雜:
- 您不能在同一事務中的後續調用中使用新插入行的DB行ID。您需要使用某種符號後向引用,因爲在處理聚合消息時客戶端和服務器之間不會進行通信。
- 呼叫回復不會立即發生(或者對每個單個呼叫的直接和單獨回覆只會是某種存根,即不包含超出「您的信息已附加到TX xyz」的任何有用信息 - if這在駱駝聚合情況下是完全可能的)。
- 先前解決方案的兩個缺點讓我想到了請求批處理,其中WS標準提供了在批處理事務內部後續調用中引用調用結果的方法。有沒有這樣的東西可用?甚至可能作爲一個PHP客戶端?
- 嘗試通過謹慎使用行級鎖等來消除數據庫中的鎖爭用。但是,當插入新元素時,我的猜測是通常頁和索引頁需要由數據庫鎖定。
- 也許一些服務器端持久層使用樂觀鎖?但是,如果數據庫寫入將被推遲到提交(不知道這是否可能),那麼在最終提交之前,這不會將任何DB ID返回給客戶端。
什麼你想?
你說的有道理。但是你錯過了「API不應該被設計爲明確地適應GUI表單提交」的要求,這意味着多個任意更新必須是可組合的。 – user1050755