写点什么

一种通过延迟事务提升数据库性能的方法

  • 2023-09-28
    北京
  • 本文字数:820 字

    阅读完需:约 3 分钟

本文分享自天翼云开发者社区《一种通过延迟事务提升数据库性能的方法》,作者:唐****律

一、背景

在数据库代理层中,写节点的数据库连接是一种很重要和稀缺的资源,提升其利用率是一个提升数据库整体性能的重要手段。数据库连接占用过高会大幅增加数据库的资源负担,降低数据库的处理能力。通过延迟启动的事务,可以减少不必要的连接占用时长,提升数据库连接利用率。


在用户通过代理层使用数据库的时候,如果提交了一条只读查询,那么代理层可以从连接池中获取一个连接、查询、获取数据、然后归还连接。


如果在只读查询之前启动了事务,那么在用户提交或者回滚事务之前,该连接不能归还到连接池,大大增加了数据库连接的占用时间。


而在 ReadCommitted 事务隔离级别中,只读查询语句的查询结果是不可重复的,这时如果事务中没有其它写操作,那么是否启动事务,对于用户实际使用是没有影响的,这样则产生了不必要的事务,增加了数据库连接占用的时间,降低了数据库连接的利用率。


二、方案

本发明提出一种通过延迟启动事务的方法,减少不必要的连接占用时长,提升数据库连接利用率,进而提升数据库的整体性能。具体实现步骤如下:


1、在用户连接未进入事务状态且在 ReadCommitted 事务隔离级别时,如果用户启动事务,则记录其事务状态为已开启,但实际上不获取数据库连接开启事务。

2、如果用户提交的 SQL 为 SELECT 等只读查询,则直接转发 SQL 到写节点或者读节点。如果用户提交的 SQL 需要进行写操作,则根据事务状态,在转发 SQL 到写节点之前先启动事务,并记录实际事务状态。

3、用户提交或者回滚事务,如果实际事务状态为未开启,则跳过结束事务操作,否则按正常流程先结束事务再回收数据库连接。


三、优点

pgpool-II、pgbouncer 等开源连接池组件,支持连接复用,但在事务处理上没有对此进行优化,这导致其在 benchmarkSQL 测试中性能受到影响,因 benchmarkSQL 性能测试中针对所有语句都会开启事务。其它数据库 ORM 框架例如 Mybatis 也有默认启动事务执行 SQL 的选项,所以此项优化是有必要的。

用户头像

还未添加个人签名 2022-02-22 加入

天翼云是中国电信倾力打造的云服务品牌,致力于成为领先的云计算服务提供商。提供云主机、CDN、云电脑、大数据及AI等全线产品和场景化解决方案。

评论

发布
暂无评论
一种通过延迟事务提升数据库性能的方法_数据库_天翼云开发者社区_InfoQ写作社区