原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处。

最近几周,发生过多起因为事务问题引起的服务报错。现象为数据库连接池连接占满,数据库连接长时间等待,最终导致请求线程hang住,服务大面积报错。这个时候,服务资源、数据库资源大量空闲,但就是进行不下去,影响是比较恶劣的。

谁来背锅?当然是架构师。因为这次所有的服务都活着,没运维什么事。

面试时,大家可能都会碰到关于事务相关的问题,升级版的可能是分布式事务的问题。在互联网行业中,一句马马虎虎的补偿事务就能蒙混过关,毕竟都是些短小精悍的接口。

但在很多企业级应用中,这行不通。我们必须直面惨淡的现实。

为什么要用长事务?

在许多业务非常复杂的后台系统,经常频繁操作DB,为了保证数据的一致性,能够在出错时回滚数据,通常会使用事务。

就拿最简单的单机数据库事务来说。

在事务操作期间,如果持续时间过长,只有等事务结束之后,DB连接才会释放,此类长时间占用DB连接的事务操作,称为长事务。一旦外部有大量请求,并发调用此操作,那么将会有大量的DB连接被持有而没有被释放掉,直到连接池爆满。

这个时候,如果有其他请求到来,那十有八九是以失败告终。

也就是说,连接资源被少数长事务操作占用。在这种情况下,即使是最简单接口查询,都不能够正常进行。

几粒老鼠屎,坏了一锅粥。

一些魔幻的反应

当你去排查这种问题的时候,可能会陷入僵局。jstack显示,多数请求其实是阻塞在tomcat的线程池上,而且是一些访问速度非常快的请求被阻塞。

比如,tomcat的200个线程,有180个阻塞在耗时不到1ms的/status接口上。

很多人就一脸懵逼。经验失灵。

jstack此时的输出结果,欺骗了我们。真正造成阻塞的,是那额外的20多个线程。

有哪些改善?

保证事务的短小是一个基本要求,包括但不限于:

应控制慢查询的调用频率,尽量减少慢查询。很多情况下,这条规则是自欺欺人的,需要业务做一些妥协。

事务内不应包含任何RPC调用,减少事务的粒度。通常,一些RPC调用,包括其他非事务资源的调用,耗时非常不可控。如果把它们也纳入事务的范围之内,势必会加剧资源的占用。事务内不应包含其他容易超时或者长时间阻塞的服务,如HTTP调用、IO操作。

次优先级服务如消息队列,不应该放在事务内,避免因为消息队列不可用引起的服务不可用。给类似消息队列的组件,设置一个合理的超时时间的非常有必要的,否则它就会一直等在那里。但即使是这样,也尽量不要把它们纳入到事务操作之内。

跨库、跨类型(如Redis),不应该放在同一事务中,可避免交叉影响。

你可以看到上面的这些描述,有些和我们所追求的数据一致性是相悖的。这不奇怪,依然是CAP原理的权衡。有些业务选择的是宁可卡死不再响应,也不能进入异常数据;有些则首先让业务运行下去,脏数据会通过补偿事务进行修正。

一切看你的选择。

设计总有人背锅,补偿总有人做出牺牲。

解决方式

那么如何来快速解决大事务造成的服务不可用问题呢?

除了扩容,其实是无解。重启大法也不见得好用。因为被阻断的请求,会以更凶猛的态势再次来袭。

你可能会想到调大连接池的大小。但在实践中得知,也不好用,大事务请求会迅速将连接池占满。

但我们可以提前进行防御。

以Spring为例,事务的使用方式大多数是使用@Transactional注解来控制的,或者是声明式事务方式。我建议以以下方式进行预防和发现:

1) 重新扫描或者Review业务代码,排查事务中是否有以上提到的各种情况。然后将除DB操作外的其他操作移动到事务之外。

2) 每个事务操作都给予足够重视,对于执行复杂度和时间复杂度不确定的事务,添加超时报警,及时发现引起的原因。

同时,还需要加强监控,辅助进行问题排查。

1) 业务可以考虑定时将数据库连接池的信息进行打印,通过看日志的方式进行初步排查。

2) 使用jstack查询执行栈,找出阻塞的点。

3) 排查并联系下游服务,找出主要原因

xjjdog倾向于使用监控快速发现问题。如图,通过连接池监控,可以看到数据库连接池连接数长时间保持在高位不释放,同时等待的线程数急剧增加。发生此种现象多数可以考虑是否是以上原因引起。

发生问题时,应及时(多次)使用jstack定位到线程的阻塞位置,然后排查下游服务是否有问题,或者是否存在慢查询。

最好的情况是服务已经进行了对代码的梳理,那么引起的原因大概率只剩下了慢查询。针对慢查询,druid数据库连接池,提供了sql的聚合,能够查看是每一类查询语句的具体执行情况。如图,短时间内SQL请求飙升,最大执行时长上升,连接池占满:

具体是哪一句SQL所引起的,一目了然。

End

长事务问题的危险级别属于高危型,通常会造成严重的后果,可以通过观察监控,防范于未然。

最优的解决方式,当然是业务模型的改进。但这东西第一涉及到开发成本,第二涉及到跨部门协作。

出钱的老板,无法听懂你这些梦话。

在一些公司内部,这两者都是让人抓狂的事情,还不如痛痛快快背个锅,来得实在。

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,​进一步交流。​

增加自增列 耗时长_又一批长事务,P0故障谁来背锅?相关推荐

  1. 又一批长事务,P0故障谁来背锅?

    原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. 最近几周,发生过多起因为事务问题引起的服务报错.现象为数据库连接池连接占满,数据库连接长时间等待,最终导致请求线程hang ...

  2. sql 增加自增列 耗时长_SQLServer为已有数据的表添加一个自增列

    ORACLE 实例及RAC ORACLE 实例及RAC 一.问题 (1)现象 部署一个sh脚本到生产oracle服务器上,该sh脚本负责读取外系统提供的txt文件,然后用sql loader入库,由o ...

  3. mysql自增列修改方法_如何修改自增列值以及相应的解决方法

    今天工作中遇到特殊的一个任务,就是将两个自增列值的进行对调变更. SQL Server 平台修改自增列值 由于之前处理过sql server数据库的迁移工作,尝试过其自增列值的变更,但是通过SQL 语 ...

  4. eui加载时间长_游戏加载时间越来越短了?背后藏着这些小心机

    在两大尚未发售的次世代主机中,或许你们还没决定好究竟是选择 PS5 还是 Xbox Series X,但毫无疑问次世代游戏表现已经震撼了所有人.更精美画面表现,更丰富的 HDR 效果,更快速的读取时间 ...

  5. python读取路径太长_路径名太长,无法打开?

    常规DOS路径限制为MAX_PATH(260)个字符,包括字符串的终止字符NUL.通过使用以\\?\前缀开头的扩展长度路径,可以超过此限制.此路径必须是完全限定的Unicode字符串,并且只能使用反斜 ...

  6. node install.js 很长_余生很长,放下错的人,才能拥抱属于你的幸福。很唯美的心灵鸡汤...

    1.有些伤害,永远无法原谅:有些伤痛,永远无法平抚:有些伤口,永远无法愈合:有些伤疤,永远无法褪去:有些亏欠,永远无法弥补:有些痛楚,永远无法忘却.哪怕再努力再用力地逼迫自己不介意,哪怕口中的不在乎说 ...

  7. oracle增加字段为主键自增_在 Oracle 中设置自增列

    如果你经常使用 MySQL,你肯定对 AUTO_INCREMENT 非常熟悉,因为经常要用到它. 一.什么是自增列 ? 自增列是数据库中值随插入的每个行自动增加的一列.它最常用于主键或 ID 字段,这 ...

  8. excel处置4000行数据卡_【R语言】5行代码批量合并Excel文件,并增加文件来源列...

    看到一篇文章, 裴帅帅:Python使用9行代码批量合并Excel文件​zhuanlan.zhihu.com 咱们R语言也不能落后啊,5行代码批量合并Excel文件,再多做一步:增加文件来源列. 说是 ...

  9. mysql 重置自增长_怎么重置mysql的自增列AUTO_INCREMENT初时值

    重置 MySQL 自增列 AUTO_INCREMENT 初时值 注意, 使用以下任意方法都会将现有数据删除. 方法一: delete from tb1; ALTER TABLE tbl AUTO_IN ...

最新文章

  1. 到2026年,非洲数据中心市场规模将达到50亿美元
  2. 自动化办公之excel教程(8):单变量求解,规划求解,页面布局,打印设置
  3. linux命令 正则表达式,详解Linux命令中的正则表达式
  4. Docker 存储选型,这些年我们遇到的坑
  5. 漫谈moosefs中cgi各项的意义
  6. 直击架构本质:优秀架构师必须掌握的几种架构思维
  7. 电脑程序上的计算机在哪里打开,电脑超级终端在哪里?电脑打开超级终端的方法...
  8. 搭建MQTT服务器实现Android客户端与ESP8266之间即时通信
  9. 角度计算公式 角度换算 想知道1是多少度; 度和弧度的关系 弧微分: 曲率,曲半径,曲率圆:
  10. JSON.stringify(value, replacer, space)详解
  11. 高德地图大头针功能_绘制点标记-在地图上绘制-开发指南-iOS 地图SDK | 高德地图API...
  12. aptos中文版白皮书-前Facebook团队打造明星公链,三个优势:Move语言、Move虚拟机、合约可升级
  13. 关于手机刷机备份资料的问题
  14. 计算机台式右上角三个灯作用,键盘右上角的三个灯是什么意思 分别代表什么...
  15. C# 将所有的DLL文件 打包到 exe里面,就是说整个项目只有一个exe
  16. 以太坊黄皮书(1~6章)
  17. 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数), 凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
  18. 利用FDTD软件仿真拓扑光子(五)-抗散射仿真与软件设置
  19. AFS文件目录数据库系统初步方案规划
  20. 【微信小程序】微信小程序tabBar使用中不显示问题

热门文章

  1. FootSwitch脚踏开关:三位USB静音脚踏板脚踏开关脚踏键盘鼠标
  2. 确定第十五届安徽赛区国赛奖项数量
  3. 花了一上午,终于完成了作业
  4. python 快速排序_小白入门知识详解:Python实现快速排序的方法(含实例代码)...
  5. python难度大的题_早看少被坑!Python 最难的问题
  6. h30-t10 android phone,荣耀(荣耀)3C H30-T10/2GB RAM/移动3G手机系统介绍评测-ZOL中关村在线...
  7. 路径字符串生成树形结构的思路_LeetCode 22. 括号生成
  8. 恩智浦智能车大赛2020_2020年中国人工智能机器人大赛在宝鸡市会展中心举办
  9. linux防火墙常用控制协议,linux防火墙配置及管理.doc
  10. mysql grant all详解_MySQL grant 语法的详细解析