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