[請益] MVC新手請教..

作者: 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包起來有沒有用
作者: DCTmaybe (竹竹人)   2019-05-31 16:46:00
你流程的每一步都會影響到下一步嗎?可以講詳細一點
作者: lwtech   2019-05-31 16:47:00
呼叫七個是將邏輯切乾淨,你現在要呼叫七個就看你要在前端封裝還是後端都可以,另外服務和controller應該是不一樣的東西,很類似但服務是controller的封裝層db慢你要自己會用工具看效能的部分,通常設定可以解決
作者: vi000246 (Vi)   2019-05-31 17:20:00
google sql transaction
作者: lwtech   2019-05-31 17:22:00
ajax 是 異步...
作者: asdasdasd80 (會計去死)   2019-05-31 18:03:00
前面都先暫存,等最後步驟再一起寫進DB行嗎
作者: chocopie (好吃的巧克力派 :))   2019-05-31 18:06:00
DB不要太頻繁寫入,不然日後還要再做優化,多一次工
作者: pilor (Formosa)   2019-05-31 18:07:00
db 寫交易
作者: DCTmaybe (竹竹人)   2019-05-31 18:08:00
聽起來是要包transaction,但七次操作是分開的,可以先在前端暫存最後才打ajax嗎?或是你要另外開一張暫存的db來儲存這些操作的結果,最後才一次寫入到要存的table
作者: puring0815   2019-05-31 18:48:00
有點模糊,每個步驟會依上個步驟結果有不同商業邏輯嗎?出錯就要還原,那出錯的定義是什麼?有可能只存四個資料表但是是代表成功?還是說要嘛沒資料要嘛七個表都有資料?
作者: pathy (pathy)   2019-05-31 18:50:00
如果7次的操作是有相關性的,那用一次ajax比較合理另外如果第三步執行失敗,前面已經執行過的兩步改動要復原的話,整個7次操作要用transaction包起來,自己查下transaction的用法吧
作者: lazarus1121 (...)   2019-05-31 19:48:00
應該1次發送,後端1次跑7個模組吧
作者: eateat33 (33來吃)   2019-05-31 19:56:00
整包包起來
作者: puring0815   2019-05-31 20:10:00
也同意可以先試試用包同一包ajax並用transaction處理
作者: forewero (木日一)   2019-05-31 20:18:00
1次Request,7次操作比較合理,然後AP or db做transaction
作者: lwtech   2019-05-31 20:21:00
ajax 有 async,await, 七個你錯哪一個你要去db 看...async 裡的 sync,沒 es6+ 就用 polyfill when,promise.
作者: clamperni (肥宅牛牛)   2019-05-31 20:33:00
M_V_C
作者: SHANGOYANYI (彥一)   2019-05-31 21:05:00
從你的描述看起來 這7張表的操作是屬於「一個交易」所以發一個ajax去後端做整包的處理會比較好做 (失敗處理透過orm的transaction機制rollback即可)
作者: ashlikewing   2019-05-31 21:15:00
這和MVC沒什麼關係,你沒有搞清楚程式流程的主要目的
作者: vi000246 (Vi)   2019-05-31 22:29:00
主要是你的流程要做什麼 不是這做法普不普遍像有些網站的setting不需要存檔 只要更新就自動存檔就會有改一個欄位就call一次api的做法但你又要還原rollback 就像一次更新整個form的七個欄位call七次 一次失敗就不存檔 那你可以直接改成一次送出整個form 不用分七次request 就邏輯設計的問題
作者: googoo1102 (googoo)   2019-05-31 22:53:00
總之送7次肯定是不好的寫法
作者: lwtech   2019-05-31 23:13:00
不然這樣好了,我們九點開盤,九點零一收盤,大家節省時間
作者: vi000246 (Vi)   2019-06-01 00:37: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) 語法,出錯就會還原了
作者: johnny4753 (Li)   2019-06-01 12:44:00
如果是用entityframework的話,只需呼叫一次SaveChange()就幫你搞定rollback問題了
作者: lwtech   2019-06-01 15:44:00
學點工具做後端流程監控吧.服務就是控制器的封裝...https://tinyurl.com/yyy33may
作者: 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:00
asp.net MVC 要特別寫出來
作者: beau03 (beau)   2019-06-02 16:05:00
各階段用cookie將值加密暫存,最後再將cookie送後端或ajax使用者如prev上一步,直接由cookie復原畫面欄位值
作者: blackie1019 (blackie)   2019-06-04 00:22:00
看一下Saga pattern 可以救你很多

Links booklink

Contact Us: admin [ a t ] ucptt.com