作者a88241050 (再回頭已是百殘身)
看板Soft_Job
標題[請益] MVC新手請教..
時間Fri May 31 16:02:02 2019
最近工作上剛寫了一支程式
當整個程式流程跑完
我總共需要insert和update7個table
然後我每次對table做操作都會透過ajax傳
json物件呼叫controller的方法
每個controller再調用service的insert或update
所以我一個流程就會發送7次ajax需求呼叫controller
現在程式寫完遇到兩個問題
一個是程式執行時間有點久..
一個是若程式出錯沒辦法把資料還原
後來有人告訴我我應該把全部流程包在一個controller的方法裡
請問這樣就能解決了嗎?
還是應該寫在service裡?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.13.209.157
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Soft_Job/M.1559289725.A.A2C.html
1F:推 cz75: 小弟也是菜雞,提供一下我的想法,第一點互相沒有影響的tabl05/31 16:19
2F:→ cz75: e也許可以用非同步提高效率?05/31 16:19
3F:→ cz75: 第二點不曉得用transaction scope包起來有沒有用05/31 16:19
4F:推 DCTmaybe: 你流程的每一步都會影響到下一步嗎?可以講詳細一點05/31 16:46
現在問題是我那七次操作都是分開的,但是我現在需要的是只要一個出錯那前面的操作都
要還原所以似乎不能這樣寫,只是我不太清楚我是要把全部邏輯寫在controller的一個方
法裡還是寫在service裡,而且似乎就是因為送了太多ajax請求導致程式跑很慢
5F:→ lwtech: 呼叫七個是將邏輯切乾淨,你現在要呼叫七個就看你要在前端05/31 16:47
6F:→ lwtech: 封裝還是後端都可以,另外服務和controller應該是不一樣的05/31 16:47
7F:→ lwtech: 東西,很類似但服務是controller的封裝層05/31 16:47
8F:→ lwtech: db慢你要自己會用工具看效能的部分,通常設定可以解決05/31 16:52
※ 編輯: a88241050 (101.13.209.157), 05/31/2019 17:18:30
9F:推 vi000246: google sql transaction05/31 17:20
10F:→ lwtech: ajax 是 異步...05/31 17:22
11F:推 asdasdasd80: 前面都先暫存,等最後步驟再一起寫進DB行嗎05/31 18:03
12F:→ chocopie: DB不要太頻繁寫入,不然日後還要再做優化,多一次工05/31 18:06
13F:推 pilor: db 寫交易05/31 18:07
14F:推 DCTmaybe: 聽起來是要包transaction,但七次操作是分開的,可以先在05/31 18:08
15F:→ DCTmaybe: 前端暫存最後才打ajax嗎?05/31 18:09
16F:→ DCTmaybe: 或是你要另外開一張暫存的db來儲存這些操作的結果,最後05/31 18:10
17F:→ DCTmaybe: 才一次寫入到要存的table05/31 18:11
18F:推 puring0815: 有點模糊,每個步驟會依上個步驟結果有不同商業邏輯 05/31 18:48
19F:→ puring0815: 嗎? 05/31 18:48
不會,只有寫入的值有差
20F:推 puring0815: 出錯就要還原,那出錯的定義是什麼?有可能只存四個 05/31 18:49
21F:→ puring0815: 資料表但是是代表成功?還是說要嘛沒資料要嘛七個表 05/31 18:49
22F:→ puring0815: 都有資料? 05/31 18:49
七次操作只要有一次出exception那之前做的都要還原
23F:推 pathy: 如果7次的操作是有相關性的,那用一次ajax比較合理 05/31 18:50
24F:→ pathy: 另外如果第三步執行失敗,前面已經執行過的兩步改動要復原 05/31 18:51
25F:→ pathy: 的話,整個7次操作要用transaction包起來,自己查下transac 05/31 18:51
26F:→ pathy: tion的用法吧 05/31 18:51
好,我會研究一下,感恩~
※ 編輯: a88241050 (101.13.209.157), 05/31/2019 19:35:36
27F:→ lazarus1121: 應該1次發送,後端1次跑7個模組吧 05/31 19:48
28F:推 eateat33: 整包包起來 05/31 19:56
29F:推 puring0815: 也同意可以先試試用包同一包ajax並用transaction處理 05/31 20:10
30F:推 forewero: 1次Request,7次操作比較合理,然後AP or db做transaction 05/31 20:18
31F:→ lwtech: ajax 有 async,await, 七個你錯哪一個你要去db 看... 05/31 20:21
32F:→ lwtech: async 裡的 sync,沒 es6+ 就用 polyfill when,promise. 05/31 20:24
33F:推 clamperni: M_V_C 05/31 20:33
所以我原本的寫法每次操作資料庫就送一次ajax這不是普遍的做法?
本來就應該要把所有流程包在一個service裡面?
※ 編輯: a88241050 (101.13.209.157), 05/31/2019 20:45:24
34F:推 SHANGOYANYI: 從你的描述看起來 這7張表的操作是屬於「一個交易」 05/31 21:05
35F:→ SHANGOYANYI: 所以發一個ajax去後端做整包的處理會比較好做 (失05/31 21:05
36F:→ SHANGOYANYI: 敗處理透過orm的transaction機制rollback即可) 05/31 21:05
37F:推 ashlikewing: 這和MVC沒什麼關係,你沒有搞清楚程式流程的主要目 05/31 21:15
38F:→ ashlikewing: 的 05/31 21:15
39F:→ vi000246: 主要是你的流程要做什麼 不是這做法普不普遍05/31 22:29
40F:→ vi000246: 像有些網站的setting不需要存檔 只要更新就自動存檔 05/31 22:30
41F:→ vi000246: 就會有改一個欄位就call一次api的做法 05/31 22:31
42F:→ vi000246: 但你又要還原rollback 就像一次更新整個form的七個欄位 05/31 22:31
43F:→ vi000246: call七次 一次失敗就不存檔 那你可以直接改成一次送出 05/31 22:32
44F:→ vi000246: 整個form 不用分七次request 就邏輯設計的問題05/31 22:32
所以也是因為我送request的次數太多導致程式執行時間過長嗎?
※ 編輯: a88241050 (101.13.209.157), 05/31/2019 22:47:41
45F:推 googoo1102: 總之送7次肯定是不好的寫法 05/31 22:53
46F:→ lwtech: 不然這樣好了,我們九點開盤,九點零一收盤,大家節省時間 05/31 23:13
47F:推 vi000246: 執行時間你可以開瀏覽器的F12看 如果是等response的時間 06/01 00:37
48F:→ vi000246: 太長 可能是後端有問題 06/01 00:38
49F:推 sxy67230: 理論上,不要去讓View處理太複雜的邏輯,正確的作法都是 06/01 01:50
50F:→ sxy67230: 把商業邏輯封裝在service裡面,controller不做邏輯,只 06/01 01:50
51F:→ sxy67230: 負責流程控制。最後,善用sql語法、必要的時候做index加06/01 01:50
52F:→ sxy67230: 速query、大量資料記得用sql做分頁,否則你會寫出很肥06/01 01:50
53F:→ sxy67230: 的邏輯,人家一行就搞定了。06/01 01:50
54F:推 iansrc: 應該是一個方法包起來吧,在 API 裡呼叫方法,AJAX 只要叫 06/01 10:49
55F:→ iansrc: 一次 API 就好。用 transaction 包那些 SQL (或是ORM) 語 06/01 10:49
56F:→ iansrc: 法,出錯就會還原了 06/01 10:49
57F:→ johnny4753: 如果是用entityframework的話,只需呼叫一次SaveChang 06/01 12:44
58F:→ johnny4753: e()就幫你搞定rollback問題了 06/01 12:44
感謝各位,我改出來了..剛Debug才發現,sevice裡面的操作做完要跳回controller才會
真正去更新資料庫,雖然說我不知道為什麼..反正把全部邏輯寫在service就能解決rollb
ack的問題了@@
※ 編輯: a88241050 (101.13.209.157), 06/01/2019 15:24:11
59F:→ lwtech: 學點工具做後端流程監控吧. 06/01 15:44
61F:→ reichs: 寫一個stored procedure處理這7張table. 06/01 18:56
62F:→ DendiQ: 我猜你是不是把所有 db sql 操作都寫在 client...? 06/01 21:39
63F:推 ian90911: asp.net MVC 要特別寫出來 06/02 13:03
64F:→ beau03: 各階段用cookie將值加密暫存,最後再將cookie送後端或aja 06/02 16:05
65F:→ beau03: x 06/02 16:05
66F:→ beau03: 使用者如prev上一步,直接由cookie復原畫面欄位值 06/02 16:06
67F:推 blackie1019: 看一下Saga pattern 可以救你很多 06/04 00:22
68F:→ eggeggss: 前6次寫入暫存檔,第7次包transaction寫入正式檔 08/17 16:01