目录
什么是高并发,高并发下为什么会有数据一致性的问题
基于资金账号体系数据库设计及开发相关的代码,测试发现问题
解决方案有哪些,不同数据一致性解决方案的特点比较,不同应用场景使用不同解决方案
总结不同的解决方案对应不同的业务场景
详解
什么是高并发,高并发下会出现什么问题,如何确保数据一致性
例子:往缸里面倒水,一个人一瓢,如果成千上百的就是并发。这个时候有一个人计数,如果所有人同时向缸里面倒水,计数的人就无法控制准确记录,这就会导致缸里面的具体有多少瓢水无法准确确定。
资金账号体系的介绍,及数据库设计
涉及到支付就会有一套完整的资金账号体系,保证用户在产品中的一个资金变动的记录。
数据脚本:
CREATE TABLE `account` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`account_type` int(2) DEFAULT NULL COMMENT '账户类型 1余额账户 2冻结账户 3消费账户 4返佣账户 5信用账户',
`user_id` bigint(20) DEFAULT NULL COMMENT '用户id',
`begin_money` decimal(12,2) DEFAULT NULL COMMENT '期初余额',
`cur_money` decimal(12,2) DEFAULT NULL COMMENT '当期发生额',
`final_money` decimal(12,2) DEFAULT NULL COMMENT '期末余额',
`accoun_status` int(2) DEFAULT NULL COMMENT '1正常 2冻结状态',
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`flag` int(1) DEFAULT NULL COMMENT '逻辑删除字段',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=124 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
CREATE TABLE `account_flew` (
`id` bigint(20) NOT NULL,
`flew_type` int(1) DEFAULT NULL COMMENT '1充值 2消费 3分账',
`business_type` int(2) DEFAULT NULL COMMENT '二级业务类型 1下单 2微信充值 3支付宝充值 ',
`business_type_msg` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '二级业务类型的注解',
`pre_order_id` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '业务关联id',
`account_id` bigint(20) DEFAULT NULL COMMENT '账户表的主键id',
`account_type` int(2) DEFAULT NULL COMMENT '账户类型表',
`user_id` bigint(20) DEFAULT NULL COMMENT '用户id',
`begin_money` decimal(12,2) DEFAULT NULL COMMENT '期初余额',
`cur_money` decimal(12,2) DEFAULT NULL COMMENT '当期发生额',
`final_money` decimal(12,2) DEFAULT NULL COMMENT '期末余额',
`pay_channel` int(2) DEFAULT NULL COMMENT '支付渠道',
`create_time` datetime DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
`flag` int(2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
操作账号相关代码编写
entity对象
@Data
public class Account {
private Long id;
/** 账户类型 1余额账户 2冻结账户 3消费账户 4返佣账户 5信用账户 */
private Integer accountType;
/** 用户id */
private Long userId;
/** 期初余额 */
private Double beginMoney;
/** 当期发生额 */
private Double curMoney;
/** 期末余额 */
private Double finalMoney;
/** 1正常 2冻结状态 */
private Integer accounStatus;
/** */
private Date createTime;
/** */
private Date updateTime;
/** 逻辑删除字段 */
private Integer flag;
}
@Data
public class AccountFlew {
private Long id;
/** 1充值 2消费 3分账 */
private Integer flewType;
/