[請益] MVC新手請教..

看板Soft_Job作者 (再回頭已是百殘身)時間5年前 (2019/05/31 16:02), 5年前編輯推噓21(21046)
留言67則, 24人參與, 5年前最新討論串1/2 (看更多)
最近工作上剛寫了一支程式 當整個程式流程跑完 我總共需要insert和update7個table 然後我每次對table做操作都會透過ajax傳 json物件呼叫controller的方法 每個controller再調用service的insert或update 所以我一個流程就會發送7次ajax需求呼叫controller 現在程式寫完遇到兩個問題 一個是程式執行時間有點久.. 一個是若程式出錯沒辦法把資料還原 後來有人告訴我我應該把全部流程包在一個controller的方法裡 請問這樣就能解決了嗎? 還是應該寫在service裡? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.13.209.157 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1559289725.A.A2C.html

05/31 16:19, 5年前 , 1F
小弟也是菜雞,提供一下我的想法,第一點互相沒有影響的tabl
05/31 16:19, 1F

05/31 16:19, 5年前 , 2F
e也許可以用非同步提高效率?
05/31 16:19, 2F

05/31 16:19, 5年前 , 3F
第二點不曉得用transaction scope包起來有沒有用
05/31 16:19, 3F

05/31 16:46, 5年前 , 4F
你流程的每一步都會影響到下一步嗎?可以講詳細一點
05/31 16:46, 4F
現在問題是我那七次操作都是分開的,但是我現在需要的是只要一個出錯那前面的操作都 要還原所以似乎不能這樣寫,只是我不太清楚我是要把全部邏輯寫在controller的一個方 法裡還是寫在service裡,而且似乎就是因為送了太多ajax請求導致程式跑很慢

05/31 16:47, 5年前 , 5F
呼叫七個是將邏輯切乾淨,你現在要呼叫七個就看你要在前端
05/31 16:47, 5F

05/31 16:47, 5年前 , 6F
封裝還是後端都可以,另外服務和controller應該是不一樣的
05/31 16:47, 6F

05/31 16:47, 5年前 , 7F
東西,很類似但服務是controller的封裝層
05/31 16:47, 7F

05/31 16:52, 5年前 , 8F
db慢你要自己會用工具看效能的部分,通常設定可以解決
05/31 16:52, 8F
※ 編輯: a88241050 (101.13.209.157), 05/31/2019 17:18:30

05/31 17:20, 5年前 , 9F
google sql transaction
05/31 17:20, 9F

05/31 17:22, 5年前 , 10F
ajax 是 異步...
05/31 17:22, 10F

05/31 18:03, 5年前 , 11F
前面都先暫存,等最後步驟再一起寫進DB行嗎
05/31 18:03, 11F

05/31 18:06, 5年前 , 12F
DB不要太頻繁寫入,不然日後還要再做優化,多一次工
05/31 18:06, 12F

05/31 18:07, 5年前 , 13F
db 寫交易
05/31 18:07, 13F

05/31 18:08, 5年前 , 14F
聽起來是要包transaction,但七次操作是分開的,可以先在
05/31 18:08, 14F

05/31 18:09, 5年前 , 15F
前端暫存最後才打ajax嗎?
05/31 18:09, 15F

05/31 18:10, 5年前 , 16F
或是你要另外開一張暫存的db來儲存這些操作的結果,最後
05/31 18:10, 16F

05/31 18:11, 5年前 , 17F
才一次寫入到要存的table
05/31 18:11, 17F

05/31 18:48, 5年前 , 18F
有點模糊,每個步驟會依上個步驟結果有不同商業邏輯
05/31 18:48, 18F

05/31 18:48, 5年前 , 19F
嗎?
05/31 18:48, 19F
不會,只有寫入的值有差

05/31 18:49, 5年前 , 20F
出錯就要還原,那出錯的定義是什麼?有可能只存四個
05/31 18:49, 20F

05/31 18:49, 5年前 , 21F
資料表但是是代表成功?還是說要嘛沒資料要嘛七個表
05/31 18:49, 21F

05/31 18:49, 5年前 , 22F
都有資料?
05/31 18:49, 22F
七次操作只要有一次出exception那之前做的都要還原

05/31 18:50, 5年前 , 23F
如果7次的操作是有相關性的,那用一次ajax比較合理
05/31 18:50, 23F

05/31 18:51, 5年前 , 24F
另外如果第三步執行失敗,前面已經執行過的兩步改動要復原
05/31 18:51, 24F

05/31 18:51, 5年前 , 25F
的話,整個7次操作要用transaction包起來,自己查下transac
05/31 18:51, 25F

05/31 18:51, 5年前 , 26F
tion的用法吧
05/31 18:51, 26F
好,我會研究一下,感恩~ ※ 編輯: a88241050 (101.13.209.157), 05/31/2019 19:35:36

05/31 19:48, 5年前 , 27F
應該1次發送,後端1次跑7個模組吧
05/31 19:48, 27F

05/31 19:56, 5年前 , 28F
整包包起來
05/31 19:56, 28F

05/31 20:10, 5年前 , 29F
也同意可以先試試用包同一包ajax並用transaction處理
05/31 20:10, 29F

05/31 20:18, 5年前 , 30F
1次Request,7次操作比較合理,然後AP or db做transaction
05/31 20:18, 30F

05/31 20:21, 5年前 , 31F
ajax 有 async,await, 七個你錯哪一個你要去db 看...
05/31 20:21, 31F

05/31 20:24, 5年前 , 32F
async 裡的 sync,沒 es6+ 就用 polyfill when,promise.
05/31 20:24, 32F

05/31 20:33, 5年前 , 33F
M_V_C
05/31 20:33, 33F
所以我原本的寫法每次操作資料庫就送一次ajax這不是普遍的做法? 本來就應該要把所有流程包在一個service裡面? ※ 編輯: a88241050 (101.13.209.157), 05/31/2019 20:45:24

05/31 21:05, 5年前 , 34F
從你的描述看起來 這7張表的操作是屬於「一個交易」
05/31 21:05, 34F

05/31 21:05, 5年前 , 35F
所以發一個ajax去後端做整包的處理會比較好做 (失
05/31 21:05, 35F

05/31 21:05, 5年前 , 36F
敗處理透過orm的transaction機制rollback即可)
05/31 21:05, 36F

05/31 21:15, 5年前 , 37F
這和MVC沒什麼關係,你沒有搞清楚程式流程的主要目
05/31 21:15, 37F

05/31 21:15, 5年前 , 38F
05/31 21:15, 38F

05/31 22:29, 5年前 , 39F
主要是你的流程要做什麼 不是這做法普不普遍
05/31 22:29, 39F

05/31 22:30, 5年前 , 40F
像有些網站的setting不需要存檔 只要更新就自動存檔
05/31 22:30, 40F

05/31 22:31, 5年前 , 41F
就會有改一個欄位就call一次api的做法
05/31 22:31, 41F

05/31 22:31, 5年前 , 42F
但你又要還原rollback 就像一次更新整個form的七個欄位
05/31 22:31, 42F

05/31 22:32, 5年前 , 43F
call七次 一次失敗就不存檔 那你可以直接改成一次送出
05/31 22:32, 43F

05/31 22:32, 5年前 , 44F
整個form 不用分七次request 就邏輯設計的問題
05/31 22:32, 44F
所以也是因為我送request的次數太多導致程式執行時間過長嗎? ※ 編輯: a88241050 (101.13.209.157), 05/31/2019 22:47:41

05/31 22:53, 5年前 , 45F
總之送7次肯定是不好的寫法
05/31 22:53, 45F

05/31 23:13, 5年前 , 46F
不然這樣好了,我們九點開盤,九點零一收盤,大家節省時間
05/31 23:13, 46F

06/01 00:37, 5年前 , 47F
執行時間你可以開瀏覽器的F12看 如果是等response的時間
06/01 00:37, 47F

06/01 00:38, 5年前 , 48F
太長 可能是後端有問題
06/01 00:38, 48F

06/01 01:50, 5年前 , 49F
理論上,不要去讓View處理太複雜的邏輯,正確的作法都是
06/01 01:50, 49F

06/01 01:50, 5年前 , 50F
把商業邏輯封裝在service裡面,controller不做邏輯,只
06/01 01:50, 50F

06/01 01:50, 5年前 , 51F
負責流程控制。最後,善用sql語法、必要的時候做index加
06/01 01:50, 51F

06/01 01:50, 5年前 , 52F
速query、大量資料記得用sql做分頁,否則你會寫出很肥
06/01 01:50, 52F

06/01 01:50, 5年前 , 53F
的邏輯,人家一行就搞定了。
06/01 01:50, 53F

06/01 10:49, 5年前 , 54F
應該是一個方法包起來吧,在 API 裡呼叫方法,AJAX 只要叫
06/01 10:49, 54F

06/01 10:49, 5年前 , 55F
一次 API 就好。用 transaction 包那些 SQL (或是ORM) 語
06/01 10:49, 55F

06/01 10:49, 5年前 , 56F
法,出錯就會還原了
06/01 10:49, 56F

06/01 12:44, 5年前 , 57F
如果是用entityframework的話,只需呼叫一次SaveChang
06/01 12:44, 57F

06/01 12:44, 5年前 , 58F
e()就幫你搞定rollback問題了
06/01 12:44, 58F
感謝各位,我改出來了..剛Debug才發現,sevice裡面的操作做完要跳回controller才會 真正去更新資料庫,雖然說我不知道為什麼..反正把全部邏輯寫在service就能解決rollb ack的問題了@@ ※ 編輯: a88241050 (101.13.209.157), 06/01/2019 15:24:11

06/01 15:44, 5年前 , 59F
學點工具做後端流程監控吧.
06/01 15:44, 59F

06/01 16:10, 5年前 , 60F
服務就是控制器的封裝...https://tinyurl.com/yyy33may
06/01 16:10, 60F

06/01 18:56, 5年前 , 61F
寫一個stored procedure處理這7張table.
06/01 18:56, 61F

06/01 21:39, 5年前 , 62F
我猜你是不是把所有 db sql 操作都寫在 client...?
06/01 21:39, 62F

06/02 13:03, 5年前 , 63F
asp.net MVC 要特別寫出來
06/02 13:03, 63F

06/02 16:05, 5年前 , 64F
各階段用cookie將值加密暫存,最後再將cookie送後端或aja
06/02 16:05, 64F

06/02 16:05, 5年前 , 65F
x
06/02 16:05, 65F

06/02 16:06, 5年前 , 66F
使用者如prev上一步,直接由cookie復原畫面欄位值
06/02 16:06, 66F

06/04 00:22, 5年前 , 67F
看一下Saga pattern 可以救你很多
06/04 00:22, 67F
文章代碼(AID): #1SyDzzei (Soft_Job)
文章代碼(AID): #1SyDzzei (Soft_Job)