php精品网站建设,青岛 网站设计,视频网站的建设,网络用户管理系统注册背景描述#xff1a;我们系统A做远程在线接口提供给B系统调用#xff0c;每次的请求参数中都带有幂等单号用来做幂等校验#xff0c;幂等单号对应的字段是不可空且唯一的。由于对应的业务表线上已有数据#xff0c;这个幂等字段数据新加的字段#xff0c;所以要做初始化数…背景描述我们系统A做远程在线接口提供给B系统调用每次的请求参数中都带有幂等单号用来做幂等校验幂等单号对应的字段是不可空且唯一的。由于对应的业务表线上已有数据这个幂等字段数据新加的字段所以要做初始化数据给每条记录设置一个幂等值进去。第1次的方案在入参进来的时候根据查询方案selectCount了此幂等号对应的数据记录首先不说selectCount方法的性能(全表扫描)其次这种提前的查询不支持并发的情况并发情况下插入的数据对插入的数据不可见的这样就不能报账幂等数据的唯一性。(被狠狠的diss了一顿)第2次的方案由于上面的方法不保险不可行必须在数据库给幂等字段加唯一索引而唯一索引的字段不可空加上之前新增的幂等字段设置的可空蚂蚁数据库限制不可将可空的字段设置为不可空所以又得新加字段设置不可空为幂等字段然后再在这个幂等字段上加唯一索引然后在插入数据时先插入数据如果插入异常而且是唯一键异常则捕获此异常给接口返回true。貌似这样的方法在线下没错误实则是凭了运气。后续将下面。(线上唯一索引又没生效并发导致重复数据进来直接被批了一顿幸亏数据可以删除数据量不大)。第3次的方案为何第2次的方案不可行呢因为唯一索引执行时有条件的。1、字段值不能为空 2、字段值不能重复。再加上以为有数据库兜底的校验机制就将代码查询校验的给去掉了结果唯一索引也没有生效索引幂等形同虚设。这是一次惨痛的教训被喷成shit了。正确的做法以代码提前查询(找一个效率高的查询不要全表扫描数据量过大会影响性能的)再加上必须生效的唯一索引。唯一索引执行成功的方法步骤1、应该先加字段2、然后初始化不同的值到幂等字段3、然后再加唯一索引这样才会使得唯一索引生效。不能将表结构变更(添加字段和添加索引放在一起执行这样的话唯一索引一定不成功)。总结这次反复在同一个问题犯错想想原因1、基础太差并发不了解数据库不了解唯一索引的用法 2、蚂蚁数据库线上和线下索引(两天才能生效)执行的不同 3、唯一索引执行生效的步骤不了解。推荐学习如何保证幂等 https://mp.weixin.qq.com/s/yeYqeQMzI6hpkNPh9TWJWQ高并发的核心技术-幂等的实现方案https://mp.weixin.qq.com/s/aqlWMxnneFhSIFJBPMW25A幂等设计https://mp.weixin.qq.com/s/MULK4lEuksByZcjGq29-2Q如何设计一个幂等接口https://mp.weixin.qq.com/s/wDBAou-nmJ2fzr5CM7j_TA