作者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/cn.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