搞了近五年的系統開發,總是抱着一種思維模式,使用者的一個操作對應一個請求和一個事務,比如:使用者選擇了N條記錄,我就會向伺服器發生一個請求,伺服器在一個事務中進行處理。前幾天在群裡一個前輩反問:批量操作難道真的要在一個事務中?這個問題讓陷入了反思,謝謝前輩們(魏瓊東)。
DDD中有聚合的概念,一個聚合有且隻有一個聚合根和一些其他實體,如:訂單聚合中,訂單是聚合根,訂單明細是聚合内的實體。因為DDD中隻能操作聚合根,這篇文章就介紹聚合根的批量删除問題。有人問聚合内的實體的删除咋弄?聚合内實體的删除必須伴随着聚合根的修改(這裡不做詳細介紹)。
另外一點是需要注意的是,引入工作單元之後,批量操作和單個操作伺服器端的邏輯是不同的,如:索引驗證問題和工号生成問題(這裡不做詳細介紹)。
我目前有三種選擇,我記錄下來,然後一個一個分析:
發送一個請求,伺服器一個事務。
發送一個請求:伺服器N個事務。
發送N個請求,伺服器N個事務。
這是我之前采用的思路,現在覺得非常不好,為什麼非要在一個事務中呢?如果您覺得非要在一個事務中,就告訴我一聲。
這種思路可以接受,不過要在伺服器端做額外的處理,如:收集哪些失敗或成功的資訊,發生給用戶端,如果我不用AJAX,我就會選擇這個方案。
考慮到我是AJAX程式設計,這種思路好,重分利用了用戶端。
思路有了,實作就不是問題了,搞個隊列排隊發送請求就行了,當然你可以選擇并行發送請求或分批次排隊發送請求。

這裡隻是示範了批量删除,有很多針對聚合根的批量操作都可以這麼處理。
架構位址:http://happy.codeplex.com