在 MongoDB 上模拟事务操作来实现支付
我们的产品叫「学海密探」,属于在线教育行业,产品需要有支付功能,然而支付最蛋疼是什么?有人会说是支付宝和微信等支付接口的接入开发!没错,但支付接口的开发算是比较简单的了,我觉得凡是跟钱有关系的操作最重要的是事务问题,这一点很重要,很重要,真的很重要!LeanCloud 官方文档中有提到 MongoDB 不支持事务,并建议对事务有强烈需求的开发者使用其他折中方式来实现。我们的支付必须用事务,我们经过 N 轮讨后论设计了一套基于 LeanCloud 的支付场景的通用解决方案,也许其他团队比我们做得好,在这里还是分享下我们的一些见解吧。
我们在用户表 _User 中加入了一个 paylogs 字段,类型是 Array,主要用于存放着每一次支付日志的 id,用它来判断用户的账户 account 的值,比如钱扣没扣,加没加等情况。因为在支付过程中不能保证每一次操作都成功,所以还要引入一个日志表 log 来做数据的一致性,保证用户资金变动与实际相符。log 表里有一个「状态」字段 state,它的取值为 0 ~ 5,主要是从发起支付开始,生成 order 表,生成 log 表等,并记录 log 的状态,后续所有的业务都要根据 state 的状态执行不同的业务操作,不管在哪个状态出问题都可以根据 log表的 state 状态重复执行相应的业务操作,从而保证支付过程的数据一致性!
比如在充值的时候,用户扣费成功后,修改用户的 account 值成功了,但在修改 state 字段时失败了,下一次再执行时又怎么判断用户的 account 值已经改变了呢?这个问题真是太重要了,这就要用到那个 paylogs 字段,判断 paylogs 字段是否有值,八戒影院有值说明刚才用户的 account 值已经操作过了,此时可以不用操作,如果没有再进行操作。这里利用了 LeanCloud 数据存储接口的按条件更新数据的功能(使用 query 参数)来保证操作的原子性,从而也解决了并发问题!这个 query 参数真得要夸一下,在 LeanCloud 还没提供这个功能之前,我们只能采用 log 表中的新旧值比对来解决数据一致问题,但无法避免并发问题,这样当用户数据错了,我们只能认为支付失败,然后进入人工干预环节,很是麻烦。
最后再说说我们和 LeanCloud 的相遇。最初是通过朋友圈知道了 LeanCloud,后来就一直关注着。也试过一些项目,发现开发应用真是方便许多。原本大量的后端需求都要自己研发,现在都省了,只需要专注于写应用端的代码,效率自然会提高一倍以上,开发迭代速度也上去了。当然也有过顾虑,生怕遇到一些特殊场景 LeanCloud 满足不了那我们就悲剧了!但后来看到一些知名的应用都在用 LeanCloud,心里也就安稳了,有前辈们踩过坑,有 LeanCloud 的技术支持做后盾,我们就这样选定了 LeanCloud。
随着项目的进行,我们从传统的后端服务接口开发变成了面向「Document」开发,服务端工作减轻了不少。虽然在数据设计中遇到一些复杂结构的问题,比如 Pointer 和 Relations 的问题。记得当时 Array 不支持 Pointer 的 include,所以考虑用 Relations,但在 LeanCloud 社区中又看到几个相关问题都推荐使用 Array 或者 Pointer,后来通读了相关文档对数据模型有了更深的理解,问题也就少了,所以说全面了解文档是至关重要的。
在 MongoDB 上模拟事务操作来实现支付的更多相关文章
- mysql数据库和mongodb数据库的相关操作以及两个数据库的区别
在docs命令中执行数据操作 MySQL数据库 先启动MySQL服务器 net start mysql 进入MySQL服务器MySQL -uroot -p(这里写你的数据库密码) (-P是从哪个端口 ...
- Android随笔之——模拟按键操作的几种方式
前几天转过一篇Android上模拟按键操作.触屏事件的博客,昨天又去找了百度.谷歌了一下,写了一点简单的测试代码,留待不时之需.有需要看之前转载的那篇博客的请看这里→_→转:Android随笔之——使 ...
- MongoDB模拟多文档事务操作
Mongodb不支持多文档原子性操作,因此依据两阶段提交协议(Two Phase Commits protocol)来模拟事务. 以两个银行账户之间的转账行为为例,来说明如何实现多文档间的事务操作. ...
- 在Windows上使用终端模拟程序连接操作Linux以及上传下载文件
在Windows上使用终端模拟程序连接操作Linux以及上传下载文件 [很简单,就是一个工具的使用而已,放这里是做个笔记.] 刚买的云主机,或者是虚拟机里安装的Linux系统,可能会涉及到在windo ...
- C++基础——模拟事务 (1)COMMAND模式
=================================版权声明================================= 版权声明:原创文章 禁止转载 请通过右侧公告中的“联系邮 ...
- 使用JDBC进行数据库的事务操作(2)
本篇将讲诉如何使用JDBC进行数据库有关事务的操作.在上一篇博客中已经介绍了事务的概念,和在MySQL命令行窗口进行开启事务,提交事务以及回滚事务的操作. 似乎事务和批处理都可以一次同时执行多条SQL ...
- 使用JDBC进行数据库的事务操作(1)
本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...
- Spring中的事务操作
事务的特性 原子性:强调事务的不可分割. 一致性:事务的执行的前后数据的完整性保持一致. 隔离性:一个事务执行的过程中,不应该受到其他事务的干扰. 持久性:事务一旦结束,数据就持久化到数据库. 如果不 ...
- MongoDB: 原子性和事务
在MongoDB中, 文档级别的的写操作是原子性的, 甚至是在对某个文档的操作中修改其多个内嵌的子文档, 也是原子性的. 在一个写操作同时修改多个文档的情况, 对其中单独的某个文档而言是原子的, 但是 ...
随机推荐
- mysql [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GRO
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c ...
- 奇异值分解(SVD)和最小二乘解在解齐次线性超定方程中的应用
奇异值分解,是在A不为方阵时的对特征值分解的一种拓展.奇异值和特征值的重要意义相似,都是为了提取出矩阵的主要特征. 对于齐次线性方程 A*X =0;当A的秩大于列数时,就需要求解最小二乘解,在||X| ...
- git移除某文件夹的版本控制
thinkphp框架,Apps/Runtime下目录移出版本控制. git rm -r -n --cached */Runtime/\* //-n:加上这个参数,执行命令时,是不会删除任何 ...
- 第32章 TIM—高级定时器—零死角玩转STM32-F429系列
第32章 TIM—高级定时器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fire ...
- dubbo 与Spring Cloud 对比
链接:https://www.zhihu.com/question/45413135/answer/242224410 近期也看到一些分享Spring Cloud的相关实施经验,这对于最近正在整理Sp ...
- python核心编程2 第八章 练习
8–2. 循环. 编写一个程序, 让用户输入三个数字: (f)rom, (t)o, 和 (i)ncrement . 以 i为步长, 从 f 计数到 t , 包括 f 和 t . 例如, 如果输入的是 ...
- java 反射bean
描述:新bean和旧bean拥有相同的字段属性.将旧bean的属性值,赋给新bean. Java代码如下: /** * 反射Bean * @param bean 反射的对象 * @param newB ...
- Delphi7卸载indy9,安装indy10步骤
1. 找到C:\Program Files\Borland\Delphi7\Borland Delphi7.msi——双击——点Next——选择Modify,点Next——找到Program File ...
- python学习之变量类型
变量: 变量是保存在内存中的值,根据变量类型开辟不同的内存空间且只允许符合该数据类型的数据才可以被存储在该内存空间中 变量赋值: 在Python中定义变量时,无需像其他语言一样需要声明数据类型.每个变 ...
- Multiplication Puzzle ZOJ - 1602
Multiplication Puzzle ZOJ - 1602 传送门 The multiplication puzzle is played with a row of cards, each c ...