看板 Soft_Job 關於我們 聯絡資訊
最近要開始搞 DB了 不過對於交易這塊不知道要怎樣去寫CODE EX 進入帳 錢匯進來 可能有兩處的DB的不同TABLE要更新資訊 (兩個要一起成功 只要一個失敗就是得ROLLBACK) 但有張TABLE可能會經常被其他支程式LOCK住(需要頻繁的UPDATE) 不知道關於這方面大家都是怎樣學的 是書上建議怎樣做就照著做了嗎? 還是看前人的CODE這樣用就用了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.194.180.20 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1559214112.A.D66.html
alan3100: 錢進來要邏輯不給進嗎? rollback後退錢? 05/30 19:17
alan3100: transaction-like:saga , w/r分離:cqrs 05/30 19:21
銀行方通知到帳後 需要把錢加上去 然後再回傳給銀行SUCCESS 的這種需求
worcdlo: 寫db慢不意外吧,改用c寫,自己用socket去對接送資料給 05/30 19:44
worcdlo: 你的server,進來的資料肯定有文件跟你說body怎麼拆,想 05/30 19:44
worcdlo: 辦法串封包之後再解析出這些body,另外資料存在memory, 05/30 19:44
worcdlo: 自定義一些資料結構去接你要的data,一般電腦的處理速度 05/30 19:44
worcdlo: 絕對來的及在交易所送下筆封包給你時把他處理完 05/30 19:44
資料要留存的 ※ 編輯: MOONY135 (123.194.180.20), 05/30/2019 19:53:10
x000032001: 2PC 3PC 05/30 19:56
worcdlo: fwrite啊…,證交所+期交所日盤,整天的封包量也不過3gb 05/30 20:01
worcdlo: 多,大致分給尖峰時段4小時,其實資料量相比電腦運算速 05/30 20:01
worcdlo: 度少的可憐,更何況當中還有很多format是重複發送,也有 05/30 20:01
worcdlo: 不少根本是heartbeat不用存 05/30 20:01
worcdlo: 還是你很執著要寫在db? 指MySQL嗎? 05/30 20:07
就會用到DB MSSQL ※ 編輯: MOONY135 (123.194.180.20), 05/30/2019 20:15:19
worcdlo: db不是很熟,你lock住是直接離開嗎?還是會卡在那個點? 05/30 20:20
worcdlo: 有沒有類似waitevent之類的東西,就交給os幫你等待 05/30 20:22
應該說會設計成有人在使用 那張TABLE就會被鎖住(要確保資料的完整性) 但我不知道怎樣去測試有沒有UPDATE成功 或者是UPDATE成功 卻只有一邊成功這樣 ※ 編輯: MOONY135 (123.194.180.20), 05/30/2019 20:25:05
alan3100: 假設只是要ack就單向寫入cmd進多少錢, 並不需要立刻處理 05/30 20:24
worcdlo: 一開始沒看仔細,以為是指那種交易,然後要trigger多種 05/30 20:25
worcdlo: 價格之類的任務 05/30 20:25
alan3100: 只有花錢需要確定不會透支,所以並不需要等扣錢的lock 05/30 20:26
worcdlo: 如果是你自己的系統,流量不大任務又簡單的話,可以考慮 05/30 20:28
worcdlo: 在外面掛一個所有人共同的event,所有讀寫都先檢查這個e 05/30 20:28
worcdlo: vent,就不用擔心不同步的問題 05/30 20:28
ripple0129: 自己的系統也不用event了吧,一個exception 兩個都rol 05/30 20:36
ripple0129: lback 05/30 20:36
worcdlo: 他的問題我猜是擔心一張寫一張沒寫,帳目上的錯誤在金融 05/30 20:40
worcdlo: 領域是很危險的,所以我才覺得統一用一個event,要嘛整 05/30 20:40
worcdlo: 個db都是你的要嘛就是乖乖排隊 05/30 20:40
你說的需求沒錯! 不過是兩個DB的兩個TABLE ※ 編輯: MOONY135 (123.194.180.20), 05/30/2019 20:42:50
lwtech: 沒有SA,這樣子大家會很擔心你,PM知道這件事嗎 05/30 20:46
這只是我自己在練習的部分而已 不是公司用的 如果公司可以讓我這樣亂來 也是心蠻大的
Caninee: 解法很多 但你這樣沒能做的範圍,很難回答 05/30 20:48
lwtech: 頻繁的UPDATE這點不太正常. 05/30 20:54
lwtech: 常用的資料就 dirty read 就好, 整個拿到前端都可以 05/30 20:56
lwtech: 另外,為什麼是不同DB ? 做確認頂多另外開個 temp table 05/30 20:59
lwtech: 不同DB 是指一個是MSSQL 另一個是 Redis 這樣? 05/30 21:00
兩個都是MSSQL 那我應該指的是同一個DB不同資料庫(?)
hsnuyi: 會計DB? 借貸要平衡齁 05/30 21:00
lwtech: 以前的做法是每天對帳一張表,給你參考,雖然我看了也傻眼 05/30 21:02
XDDDDDDDDDDD
snick: two phase commit 05/30 21:35
※ 編輯: MOONY135 (123.194.180.20), 05/30/2019 22:16:38
lwtech: 不同Schema...警察 !! 05/30 22:18
rexhuang: https://bit.ly/2QzhvHj,先解決Blocking或Deadlock問題 05/31 00:13
rexhuang: 也可以寫入不同帳務暫存檔,再整批過帳到主檔,避免lock 05/31 00:21
rexhuang: 感覺你需求只要日終帳正確,悠遊卡和ATM系就不能這樣處理 05/31 00:22
MOONY135: 要悠遊卡那種的 不能整天過完在算 05/31 02:01
flowwinds: 2 phase commit 05/31 03:00
ripple0129: 需求不清楚下,直接給你關鍵字distributed transactio 05/31 03:55
ripple0129: n去翻文章看比較快 05/31 03:55
alihue: 拿第三個 db 紀錄那兩個 table trans 有沒有各自完成,第 05/31 09:05
alihue: 三個 db 有收到那兩個 trans 都完成,就完成本次交易。當 05/31 09:05
alihue: 然上述流程是在 ap 端做,只是借用 db trans 的成熟度來當 05/31 09:05
alihue: log 確保交易進度 05/31 09:05
MOONY135: 感謝各位大大的回覆 05/31 09:14
jej: 另開一個table紀錄本次交易 再弄一個批次去更新別的資料庫? 06/01 17:38
dsakryk: 可以看看阿里開源的https://github.com/seata/seata 06/01 23:02