最近在公司遇到一个问题,挂号系统是做的集群,比如启动了两个相同的服务,病人挂号的时候可能会出现同号的情况,比如两个病人挂出来的号都是上午2号。这就出现了问题,由于是集群部署的,所以单纯在代码中的方法中加锁是不能解决这种情况的。下面我将模拟这种情况,用复述做分布式锁来解决这个问题。
1。新建挂号明细表
2。在思想上新建项目
下图是创建好的项目结构,上面那个父项目是其他项目不用管它,和新建的没有关系
3。开始创建控制器,服务,刀(映射),写好后整体结构如下
这里贴上服务实现类的代码,主要代码就是这一块:
包com.zk.service.impl; 进口com.zk.mapper.MzMapper; 进口com.zk.service.MzService; 进口org.springframework.beans.factory.annotation.Autowired; 进口org.springframework.stereotype.Service; 进口java.util.HashMap; 进口java.util.Map;/* * *门诊操作服务实现类 * * @author zk * @date 2020-9-9 */@ service 公共类MzServiceImpl实现MzService { @ autowired 私人MzMapper MzMapper; @Override 公共Map<字符串,Object>ysdm ksdm gh(字符串,字符串,字符串brid) { Object> Map<字符串;,resultMap=new HashMap<的在(); int ghxh=0;//获取当前的挂号序号 Object> Map<字符串;ghxhMap=mzMapper.getGhxh (ksdm ysdm);//如果为空,说明还没有人挂这个医生的号,当前是一号 如果(ghxhMap==null) { ghxh=1; 其他}{ ghxh=(int) ghxhMap.get (“ghxh”); ghxh + +; }//实际场景中,先获取到ghxh后,还会进行收费等其他操作,这里模拟一下需要耗费时间,为了方便测试出现问题,这里时间设置稍微长一点 尝试{ thread . sleep (2000); }捕捉(InterruptedException e) { e.printStackTrace (); }//新增挂号明细记录 mzMapper.addGhmx (ksdm ysdm、ghxh brid); resultMap.put(“代码”,“200”); resultMap.put(“味精”,“成功”); 返回resultMap; } }
4。进行测试
1)清空数据库表
2)使用邮递员发送帖子请求,假设ksdm=1表示皮肤科,ysdm=1表示医生华佗,brbh=1表示张三,现在张三去医院挂皮肤科华佗医生的号,收费员就会操作系统调用上面写的挂号接口。
调用成功后,看看数据库里的数据
可以看到张三挂到了华佗医生的第一个号,接着把请求参数的brbh改成2表示李四,李四也去挂华佗医生的号
请求成功后查看数据库
可以看到李四挂了华佗医生的第二个号。现在就是正常的挂的号,没有出现问题。
3)邮差开第二个请求窗口,两个窗口同时去掉接口进行挂号
窗口一模拟张三挂号
窗口二模拟李四挂号
操作成功后看看数据库