[請益] 交易方面的知識(DB)

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

Links booklink

Contact Us: admin [ a t ] ucptt.com