背景描述:我们系统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 为空 唯一索引_记一次线上唯一索引失效没有起效的场景相关推荐

  1. java mysql死锁_记一次线上mysql死锁分析(一)

    记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...

  2. 在线分析mysql死锁详解_记一次线上mysql死锁分析(一)

    记录一次比较诡异的mysql死锁日志.系统运行几个月来,就在前几天发生了一次死锁,而且就只发生了一次死锁,整个排查过程耗时将近一天,最后感谢我们的DBA大神和老大一起分析找到原因. 诊断死锁 借助于我 ...

  3. mysql时区错乱_记一次线上mysql时区错乱

    Mysql查询时间和页面显示时间相差八个小时. 在一次线上程序调用mysql内部函数转化时间戳的时候的bug记录.在本地开发与测试环境都没得问题.但是上线后,程序总是不再状态. 遂开启审阅代码的过程, ...

  4. 记一次线上应用连接池满的处理

    记一次线上应用dubbo-claim连接池满的处理 首先看到dubbo-claim应用突然大面积报错,基本反馈是冻结预算出问题了,看了看冻结预算的代码,发现写的非常复杂,果断放弃看代码来排查问题. C ...

  5. 记一次线上coredump事故

    转自:http://www.likecs.com/show-16439.html 记一次线上coredump事故 1.事故背景 上周三凌晨,我负责的某个模块在多台机器上连续发生coredump,幸好发 ...

  6. 记一次线上环境 redis偶尔连接超时报错 解决

    记一次线上环境 redis偶尔连接超时报错 解决 贴出本地控制台日志 说实话,很痛苦,跟进很久了,一直认为的jvm程序所使用的配置的连接池框架问题 因为程序为 springboot 2 spring ...

  7. 记几次 [线上环境] Dubbo 线程池占满原因分析(第三次:GC STW)

    [线上环境] Dubbo 线程池占满原因排查系列 记几次 [线上环境] Dubbo 线程池占满原因分析(第一次:HttpClient) 记几次 [线上环境] Dubbo 线程池占满原因分析(第二次:C ...

  8. mongo 唯一约束索引_快速掌握mongoDB(三)——mongoDB的索引详解

    1 mongoDB索引的管理 本节介绍mongoDB中的索引,熟悉mysql/sqlserver等关系型数据库的小伙伴应该都知道索引对优化数据查询的重要性.我们先简单了解一下索引:索引的本质就是一个排 ...

  9. access建立两个字段唯一索引_面试官:谈谈你对mysql索引的认识?

    引言 这篇我们就来谈谈关于索引方面的mysql面试题.还是老规矩,讲的是在Innodb存储引擎下的情形,毕竟我还真没用过Mysiam之类的存储引擎. ps:其实很早就想写了,一直偷懒! 其实这下面每个 ...

最新文章

  1. git解决“failed to push some refs to“问题
  2. Mac OS包管理器Homebrew
  3. python函数自定义教程_Python中自定义函数的教程
  4. 非阻塞同步算法与CAS(Compare and Swap)无锁算法
  5. javascript函数,值得参考!
  6. 摘录 vue.js代码片段的理解
  7. zabbix详解(二)——zabbix工作原理
  8. 一篇文章讲清楚人工智能、机器学习和深度学习的区别与联系
  9. 凸优化第五章对偶 5.9 广义不等式
  10. 第十八篇 难点突破之-VUE中使用 C-LODOP 实现模板的套打
  11. linux udp 端口测试,RAKsmart:Linux下TCP/UDP 端口测试及验证方法说明
  12. ROS单线程与多线程处理
  13. Mac电脑访问不了正常URL
  14. 在clubof.net上建立了个人主页
  15. 解决只读文件系统问题
  16. ORA-01186、ORA-01157、ORA-01111、ORA-01110 错误处理方法
  17. 广东开放大学形考任务财务会计(二)(专,2022秋)形成性考核3答案
  18. Android用mediaPlayer.prepare()报错
  19. 出价成本计算机软件,关键词移动如何出价_移动出价比例设置的注意事项
  20. 5000词学英语——DAY3

热门文章

  1. linux mint 18.3浏览器,在Linux Mint 19/Ubuntu 18.04中安装Tor Browser浏览器的方法
  2. python调用.a静态库_Python 调用 C
  3. 360手机浏览器升级至chrome62 成内核版本最高的手机浏览器
  4. MySQL如何有效的存储IP地址
  5. SpringBoot与日志配置
  6. Eclipse构建Maven分包分模块项目并构建服务端
  7. spring中context:property-placeholder标签详解
  8. 悖论对计算机科学影响,数学和计算机科学的核心逻辑悖论
  9. java put set_Java PutItemRequest.setItem方法代码示例
  10. 频率统计表用c语言_空间矢量脉宽调制建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)...