Soft_Job 板


LINE

最近工作上剛寫了一支程式 當整個程式流程跑完 我總共需要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
60F:→ lwtech: 服務就是控制器的封裝...https://tinyurl.com/yyy33may 06/01 16:10
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







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:iOS 或 站內搜尋

TOP