作者:
a88241050 (å†å›žé 已是百殘身)
2019-05-31 16:02:02最近工作上剛寫了一支程式
當整個程式流程跑完
我總共需要insert和update7個table
然後我每次對table做操作都會透過ajax傳
json物件呼叫controller的方法
每個controller再調用service的insert或update
所以我一個流程就會發送7次ajax需求呼叫controller
現在程式寫完遇到兩個問題
一個是程式執行時間有點久..
一個是若程式出錯沒辦法把資料還原
後來有人告訴我我應該把全部流程包在一個controller的方法裡
請問這樣就能解決了嗎?
還是應該寫在service裡?
作者:
cz75 (訣別的九月)
2019-05-31 16:19:00小弟也是菜雞,提供一下我的想法,第一點互相沒有影響的table也許可以用非同步提高效率?第二點不曉得用transaction scope包起來有沒有用
作者: lwtech 2019-05-31 16:47:00
呼叫七個是將邏輯切乾淨,你現在要呼叫七個就看你要在前端封裝還是後端都可以,另外服務和controller應該是不一樣的東西,很類似但服務是controller的封裝層db慢你要自己會用工具看效能的部分,通常設定可以解決
作者: lwtech 2019-05-31 17:22:00
ajax 是 異步...
作者:
chocopie (好吃的巧克力派 :))
2019-05-31 18:06:00DB不要太頻繁寫入,不然日後還要再做優化,多一次工
作者:
pilor (Formosa)
2019-05-31 18:07:00db 寫交易
聽起來是要包transaction,但七次操作是分開的,可以先在前端暫存最後才打ajax嗎?或是你要另外開一張暫存的db來儲存這些操作的結果,最後才一次寫入到要存的table
作者: puring0815 2019-05-31 18:48:00
有點模糊,每個步驟會依上個步驟結果有不同商業邏輯嗎?出錯就要還原,那出錯的定義是什麼?有可能只存四個資料表但是是代表成功?還是說要嘛沒資料要嘛七個表都有資料?
作者:
pathy (pathy)
2019-05-31 18:50:00如果7次的操作是有相關性的,那用一次ajax比較合理另外如果第三步執行失敗,前面已經執行過的兩步改動要復原的話,整個7次操作要用transaction包起來,自己查下transaction的用法吧
作者: eateat33 (33來吃) 2019-05-31 19:56:00
整包包起來
作者: puring0815 2019-05-31 20:10:00
也同意可以先試試用包同一包ajax並用transaction處理
1次Request,7次操作比較合理,然後AP or db做transaction
作者: lwtech 2019-05-31 20:21:00
ajax 有 async,await, 七個你錯哪一個你要去db 看...async 裡的 sync,沒 es6+ 就用 polyfill when,promise.
從你的描述看起來 這7張表的操作是屬於「一個交易」所以發一個ajax去後端做整包的處理會比較好做 (失敗處理透過orm的transaction機制rollback即可)
作者: ashlikewing 2019-05-31 21:15:00
這和MVC沒什麼關係,你沒有搞清楚程式流程的主要目的
主要是你的流程要做什麼 不是這做法普不普遍像有些網站的setting不需要存檔 只要更新就自動存檔就會有改一個欄位就call一次api的做法但你又要還原rollback 就像一次更新整個form的七個欄位call七次 一次失敗就不存檔 那你可以直接改成一次送出整個form 不用分七次request 就邏輯設計的問題
作者: lwtech 2019-05-31 23:13:00
不然這樣好了,我們九點開盤,九點零一收盤,大家節省時間
執行時間你可以開瀏覽器的F12看 如果是等response的時間太長 可能是後端有問題
作者:
sxy67230 (charlesgg)
2019-06-01 01:50:00理論上,不要去讓View處理太複雜的邏輯,正確的作法都是把商業邏輯封裝在service裡面,controller不做邏輯,只負責流程控制。最後,善用sql語法、必要的時候做index加速query、大量資料記得用sql做分頁,否則你會寫出很肥的邏輯,人家一行就搞定了。
作者:
iansrc (Ian)
2019-06-01 10:49:00應該是一個方法包起來吧,在 API 裡呼叫方法,AJAX 只要叫一次 API 就好。用 transaction 包那些 SQL (或是ORM) 語法,出錯就會還原了
如果是用entityframework的話,只需呼叫一次SaveChange()就幫你搞定rollback問題了
作者: lwtech 2019-06-01 15:44:00
作者: reichs 2019-06-01 18:56:00
寫一個stored procedure處理這7張table.
作者:
DendiQ (貔貅)
2019-06-01 21:39:00我猜你是不是把所有 db sql 操作都寫在 client...?
作者:
ian90911 (xopowo)
2019-06-02 13:03:00asp.net MVC 要特別寫出來
作者:
beau03 (beau)
2019-06-02 16:05:00各階段用cookie將值加密暫存,最後再將cookie送後端或ajax使用者如prev上一步,直接由cookie復原畫面欄位值