[求助]关于金额处理的问题?

一个很简单的功能 - 视频下载,逻辑是这样的。
1:user 表用户金额减少
2:money_records 表记录一下
3:videos 表 下载次数增加一次。

一般都是把这三次操作放到一个事务里面,有什么别的办法么?
可以将三次操作单独管理,又保证数据的一致性么?
想过用事件队列,但是又保证不了数据的一致性!

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

没有吧,不在事务里怎么保证一致性,其他操作失败没法回滚之前的操作啊。 非要拆开的话,从业务角度分析,扣钱是主要逻辑,那么可以在用户扣款成功后做两个异步操作:1.下载+1,2.添加记录,只需要保证异步操作一定成功即可。下载数和消费记录一般来说对业务影响不大,不过还是得看你们的业务场景吧。

3年前 评论
qiyeal (楼主) 3年前
讨论数量: 6

没有吧,不在事务里怎么保证一致性,其他操作失败没法回滚之前的操作啊。 非要拆开的话,从业务角度分析,扣钱是主要逻辑,那么可以在用户扣款成功后做两个异步操作:1.下载+1,2.添加记录,只需要保证异步操作一定成功即可。下载数和消费记录一般来说对业务影响不大,不过还是得看你们的业务场景吧。

3年前 评论
qiyeal (楼主) 3年前
游离不2

有事务就有锁的问题,而锁的问题大多是由并发引起,所以先解决并发问题,锁也就问题不大了。那并发的问题怎么解决呢,最简单的办法就是通过队列,将并行转串行。

3年前 评论

肯定是加事务啊

3年前 评论
qiyeal (楼主) 3年前

保证一致性的话,1,2步骤要写一个回滚的接口,如果2失败,就通过接口回滚1的操作。3失败,回滚2和1。

3年前 评论

事务的四大特性ACID了解一下...

3年前 评论

”将三次操作单独管理“指的是编程上的吗?

3年前 评论
qiyeal (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!