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