RDS MySQL的数据库代理提供事务拆分功能,该功能在保证业务中读写一致性的前提下,能够将事务内第一个写请求之前的读请求转发到只读实例,降低主实例负载。本文介绍如何设置事务拆分。
前提条件
背景信息
默认情况下,RDS MySQL的数据库代理会将事务内的所有请求都发送到主实例以保障事务的正确性,但是某些框架会将所有请求封装到非自动提交的事务中(通过执行set autocommit=0;
关闭自动提交),导致主实例负载过大,如下图所示。
为了解决上述问题,可以使用数据库代理的事务拆分(默认开启)功能。您不需要改动应用的代码或配置就可以将事务中的读压力从主节点转移到只读节点,从而提高主节点的稳定性。
开启事务拆分后,在默认的Read Committed隔离级别下,当RDS MySQL关闭事务自动提交后,仅会在发生写操作时才正式开启事务,正式开启事务前的读请求会通过负载均衡模块分流至只读实例。
2024年07月31日及之后创建的实例显式事务(例如begin或者start transaction)默认支持拆分,2024年07月31日之前开通的实例仅支持拆分隐式开启的事务。
路由逻辑示例(关闭自动提交,隐式开启的事务):
SQL类型 | 路由至 | 备注 |
SELECT | 只读实例 | 事务内写前读。 |
SELECT | 只读实例 | 事务内写前读。 |
UPDATE / INSERT / DELETE | 主实例 | 事务首次写操作(开启事务)。 |
SELECT | 主实例 | 事务内写后读。 |
UPDATE / INSERT / DELETE | 主实例 | 写操作。 |
SELECT | 主实例 | 事务内写后读。 |
COMMIT | 主实例 | 事务提交阶段。 |
开启或关闭事务拆分
开通数据库代理后,事务拆分默认开启,您可以根据需求随时关闭或开启事务拆分功能。
访问RDS实例列表,在上方选择地域,然后单击目标实例ID。
在左侧导航栏,单击数据库代理。
在连接信息区域,在目标代理连接地址的操作列,单击修改配置。
在弹出的对话框中,单击事务拆分右侧的开启或关闭。
说明开通或关闭事务拆分后仅对新连接生效。
相关API
API | 描述 |
查询RDS实例的数据库代理详情。 | |
查询RDS实例数据库代理的连接地址信息。 | |
修改RDS实例数据库代理的代理终端设置。 |