首页 > 数据库 >从结算业务 深入理解 并发,mysql 乐观锁,可重复读

从结算业务 深入理解 并发,mysql 乐观锁,可重复读

时间:2022-09-29 18:45:33浏览次数:50  
标签:更改 处理 账户 结算 并发 mysql

从结算业务 深入理解 并发,mysql 乐观锁,可重复读

结算 一般就是 ,把一些未结算的订单 金额,周期性的 结算 到 对应的账户 表里面去。

一般就是 通过定时任务 分批跑,比如每个月 几号 结算一次 给供应商。

思路一:

根据条件

while(true){

// 查询一批数据处理

// 满足条件 break

// 处理业务 更改账户 ,记录流水,更改一批状态

}

思路一 存在的问题:

可能会死锁:

模拟:更改账户 一般都会使用乐观锁 ,改成功 就记录 流水 更改一批数据的状态。

​ 假如刚好 并发操作账户 (就会有一批数据没有处理),那么由于 mysql 5.6 以后隔离级别是可重复 读,所以就会 一直查询到那批数据未处理,而账户表又是 乐观锁 ,由于可重复读 导致版本号 一直读的不是最新的。所以就卡在这里了,很好模拟出来。

思路二

for(i=1;i<=totalPage,i++){

// 一页页处理

//处理业务 更改账户 ,记录流水,更改一批状态

}

思路二存在问题

分页处理完成后 ,乐观锁操作账户 会出现一批数据未处理 。

分页只能当前页只能是第一页,不能是 i ,因为处理完成后 状态变化,分页数据就不对了 会跳过一些数据。

思路三

相对比较完美 解决 并发场景,且能保证所有数据全部处理一边,不会漏掉数据。

for(i=1;i<=totalPage,i++){

// 一页页处理

// 固定 当前页 为 1

//处理业务 更改账户 ,记录流水,更改一批状态 ,记录有没有发生并发操作。

}

// 循环完成后,判断是否发生了并发,因为并发 就会存在 数据未处理

// 存在并发 就在使用 可调度线程池 在调度 一下结算 逻辑

private ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);


scheduledExecutorService.schedule(()->{
 log.info("重跑任务");
},20,TimeUnit.SECONDS);

写好程序 不简单,并发场景下 会出很多问题,处理的好,得加深 知识的理解。

标签:更改,处理,账户,结算,并发,mysql
From: https://www.cnblogs.com/lyc88/p/16742610.html

相关文章

  • MySQL拷贝表的几种方式
    Mysql拷贝表拷贝结构-添加数据##拷贝结构CREATETABLEnewTableLIKEoldTable;##添加数据INSERTINTOnewTableSELECT*FROMoldTable;1234拷贝结构和数据CREATETAB......
  • mysql8日志占满磁盘解决办法
    SHOWBINARYLOGS;setglobalbinlog_expire_logs_seconds=60*60*24;showvariableslike'%expire%';flushprivileges;永久改动可以找到/etc/mysql/my.cnf(Ubunt......
  • Docker MySql8 创建、删除、授权用户
    目录DockerMySql8创建、删除、授权用户1、登录MySql82、用户操作2.1、查看用户2.2、创建本地用户2.3、创建外网可访问用户2.4、修改用户2.5、删除用户3、操作用户权限3.1......
  • Mysql取整函数
    Mysql取整函数1.round四舍五入取整round(s,n):对s四舍五入保留n位小数,n取值可为正、负、零.如四舍五入到整数位,则n取零.2.ceil向上取整ceil(s):返回比s大的最小整数3.floo......
  • Mysql主从复制与读写分离
    参考:https://www.bilibili.com/video/BV13a411q753?p=172&vd_source=c85b4a015a69e82ad4f202bd9b87697f主从复制介绍  配置-前置条件 -主库Master找不到的可......
  • MYSQL连接字符串参数解析
    Server,host,datasource,datasource,address,addr,networkaddress:数据库位置(以上任何关键字均可)Database,initialcatalog:数据库名Port:      socket端口......
  • docker配置mysql主从复制
    1、新建主服务器容器实例3310dockerrun-p3310:3306--namemysql-master\-v/mydata/mysql-master/log:/var/log/mysql\-v/mydata/mysql-master/data:/var/lib/m......
  • MySQL查询 7:连接查询
    当查询结果的列来源于多张表时,需要将多张表连接成一个大的数据集,再选择合适的列返回mysql支持三种类型的连接查询,分别为:内连接查询:查询的结果为两个表匹配到的数据左连接查......
  • MySQL高级 4:数据库设计
    关系型数据库建议在E-R模型的基础上,我们需要根据产品经理的设计策划,抽取出来模型与关系,制定出表结构,这是项目开始的第一步在开发中有很多设计数据库的软件,常用的如powerdes......
  • MySQL高级 3:索引
    1.思考在图书馆中是如何找到一本书的?在字典中查找一个单词?   一般的应用系统对比数据库的读写比例在10:1左右(即有10次查询操作时有1次写的操作),而且插入操作和更新操......