一切基于最近两天帮排查数据库阻塞问题说起,是这样的一个更新方法执行超时之后,一个事务在测试环境一直Runing,一直没提交也没回滚,相关的行操作也被阻塞掉。按说Spring Boot对数据库中都设置connection-timeout,超时的时候自动触发异常会自动回滚。不至于测试环境这个服务不可用。
数据库连接池用的hikari,但是我们对这个connection-timeout理解对吗?spring.datasource.hikari.connection-timeout:这个是获取连接的超时时间,就是从连接池返回连接的超时时间。
ConnectionTimeout来自GitHub的解释:
This property controls the maximum number of milliseconds that a client (that's you) will wait for a connection from the pool. If this time is exceeded without a connection becoming available, a SQLException will be thrown. Lowest acceptable connection timeout is 250 ms. Default: 30000 (30 seconds)
SQL执行超时时间设置:
JDBC可以直接使用:
Statement.setQueryTimeout
Spring 可以使用:
@Transactional(timeout=10)
MyBatis-Plus可以使用:
mybatis-plus.configuration.default-statement-timeout
MyBatis-XML文件可以使用:
<select id="" timeout="">xxx</select>
高级别的timeout依赖于低级别的timeout,只有当低级别的timeout无误时,高级别的timeout才能确保正常。超时时间一般有发起方/调用方设置。
大多时候我们线上遇到此种问题,找出对应的事务线程ID,赶紧去kill对应事务的进程。实在不行就用重启大法,事后大多数的做法是优化SQL,优化事务。但是SQL执行的超时时间还要设置的。避免系统在卡顿的时候导致事务阻塞,独占锁占用,其他事务锁等待。
我们该怎么样保护系统?分布式锁,乐观锁,X锁,间隙锁,大事务对数据行操作顺序不一致,我们在开发设计的时候应该怎么做?越是细节越是对技术的基础要求越高。只有稳定的架构我们再谈扩展性才严谨,在不稳定的架构上谈扩展只会给自己慢慢挖坑。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有