telephone 为空 唯一索引_记一次线上唯一索引失效没有起效的场景
背景描述:我们系统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
telephone 为空 唯一索引_记一次线上唯一索引失效没有起效的场景相关推荐
- java mysql死锁_记一次线上mysql死锁分析(一)
记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...
- 在线分析mysql死锁详解_记一次线上mysql死锁分析(一)
记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...
- mysql时区错乱_记一次线上mysql时区错乱
Mysql查询时间和页面显示时间相差八个小时. 在一次线上程序调用mysql内部函数转化时间戳的时候的bug记录.在本地开发与测试环境都没得问题.但是上线后,程序总是不再状态. 遂开启审阅代码的过程, ...
- 记一次线上应用连接池满的处理
记一次线上应用dubbo-claim连接池满的处理 首先看到dubbo-claim应用突然大面积报错,基本反馈是冻结预算出问题了,看了看冻结预算的代码,发现写的非常复杂,果断放弃看代码来排查问题. C ...
- 记一次线上coredump事故
转自:http://www.likecs.com/show-16439.html 记一次线上coredump事故 1.事故背景 上周三凌晨,我负责的某个模块在多台机器上连续发生coredump,幸好发 ...
- 记一次线上环境 redis偶尔连接超时报错 解决
记一次线上环境 redis偶尔连接超时报错 解决 贴出本地控制台日志 说实话,很痛苦,跟进很久了,一直认为的jvm程序所使用的配置的连接池框架问题 因为程序为 springboot 2 spring ...
- 记几次 [线上环境] Dubbo 线程池占满原因分析(第三次:GC STW)
[线上环境] Dubbo 线程池占满原因排查系列 记几次 [线上环境] Dubbo 线程池占满原因分析(第一次:HttpClient) 记几次 [线上环境] Dubbo 线程池占满原因分析(第二次:C ...
- mongo 唯一约束索引_快速掌握mongoDB(三)——mongoDB的索引详解
1 mongoDB索引的管理 本节介绍mongoDB中的索引,熟悉mysql/sqlserver等关系型数据库的小伙伴应该都知道索引对优化数据查询的重要性.我们先简单了解一下索引:索引的本质就是一个排 ...
- access建立两个字段唯一索引_面试官:谈谈你对mysql索引的认识?
引言 这篇我们就来谈谈关于索引方面的mysql面试题.还是老规矩,讲的是在Innodb存储引擎下的情形,毕竟我还真没用过Mysiam之类的存储引擎. ps:其实很早就想写了,一直偷懒! 其实这下面每个 ...
最新文章
- git解决“failed to push some refs to“问题
- Mac OS包管理器Homebrew
- python函数自定义教程_Python中自定义函数的教程
- 非阻塞同步算法与CAS(Compare and Swap)无锁算法
- javascript函数,值得参考!
- 摘录 vue.js代码片段的理解
- zabbix详解(二)——zabbix工作原理
- 一篇文章讲清楚人工智能、机器学习和深度学习的区别与联系
- 凸优化第五章对偶 5.9 广义不等式
- 第十八篇 难点突破之-VUE中使用 C-LODOP 实现模板的套打
- linux udp 端口测试,RAKsmart:Linux下TCP/UDP 端口测试及验证方法说明
- ROS单线程与多线程处理
- Mac电脑访问不了正常URL
- 在clubof.net上建立了个人主页
- 解决只读文件系统问题
- ORA-01186、ORA-01157、ORA-01111、ORA-01110 错误处理方法
- 广东开放大学形考任务财务会计(二)(专,2022秋)形成性考核3答案
- Android用mediaPlayer.prepare()报错
- 出价成本计算机软件,关键词移动如何出价_移动出价比例设置的注意事项
- 5000词学英语——DAY3
热门文章
- linux mint 18.3浏览器,在Linux Mint 19/Ubuntu 18.04中安装Tor Browser浏览器的方法
- python调用.a静态库_Python 调用 C
- 360手机浏览器升级至chrome62 成内核版本最高的手机浏览器
- MySQL如何有效的存储IP地址
- SpringBoot与日志配置
- Eclipse构建Maven分包分模块项目并构建服务端
- spring中context:property-placeholder标签详解
- 悖论对计算机科学影响,数学和计算机科学的核心逻辑悖论
- java put set_Java PutItemRequest.setItem方法代码示例
- 频率统计表用c语言_空间矢量脉宽调制建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)...