AWS RDS Proxy与Entity Framework Core兼容性问题求助
解决方案:AWS RDS Proxy + EF Core MySQL 出现DbUpdateConcurrencyException(实际行已更新)
问题背景
在使用.NET 6 + EF Core 7.0.8 + Pomelo 7.0.0 + MySqlConnector 2.2.6,通过RDS Proxy连接Aurora MySQL 8.0(Serverless V2)时,执行更新语句后EF Core抛出DbUpdateConcurrencyException,提示"预期影响1行但实际为0行",但目标行已成功更新。EF Core生成的SQL如下:
SET AUTOCOMMIT = 1; UPDATE `myTable` SET `myValue` = @p0 WHERE `myId` = @p1; SELECT ROW_COUNT();
直接连接RDS实例无此问题,仅通过Proxy连接时触发异常。
解决方案
1. 调整RDS Proxy会话固定策略
RDS Proxy的连接池复用机制可能导致ROW_COUNT()返回之前会话的操作结果,而非当前更新的结果。修改CloudFormation中DBProxyTargetGroup的配置,添加会话过滤规则:
DBProxyTargetGroup: Type: AWS::RDS::DBProxyTargetGroup Properties: DBProxyName: !Ref DBProxy DBClusterIdentifiers: - !Ref Cluster TargetGroupName: default ConnectionPoolConfigurationInfo: MaxConnectionsPercent: 100 MaxIdleConnectionsPercent: 50 SessionPinningFilters: - 'EXCLUDE_VARIABLE_SETS'
该配置会让Proxy在复用连接时重置会话变量,避免历史会话的ROW_COUNT()值干扰当前操作。
2. 自定义EF Core并发检测逻辑
如果Proxy配置调整无效,可直接修改EF Core的并发检测行为:
- 关闭实体级并发检查:在实体配置中禁用并发令牌
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<MyTable>() .Property(e => e.MyValue) .IsConcurrencyToken(false); }
- 手动执行原生SQL并处理结果:绕过EF Core默认的并发检测逻辑
var affectedRows = await context.Database.ExecuteSqlInterpolatedAsync( $"UPDATE `myTable` SET `myValue` = {myValue} WHERE `myId` = {myId}; SELECT ROW_COUNT();"); // 手动根据返回的行数处理业务逻辑
3. 升级数据库驱动版本
当前使用的MySqlConnector 2.2.6和Pomelo 7.0.0可能存在与RDS Proxy的兼容性问题,尝试升级到最新稳定版本:
- 升级
Pomelo.EntityFrameworkCore.MySql至8.0.x版本(适配.NET 6/7/8) - 升级
MySqlConnector至3.0.x及以上版本
新版本驱动针对RDS Proxy的会话处理做了优化,可解决ROW_COUNT()返回异常的问题。
4. 开启Proxy调试日志排查
开启RDS Proxy的Debug日志,查看SQL请求转发的详细流程:
修改CloudFormation中DBProxy的配置:
DBProxy: Type: AWS::RDS::DBProxy Properties: ... DebugLogging: true ...
通过CloudWatch查看Proxy日志,分析ROW_COUNT()的返回值是否被Proxy篡改,进一步定位问题根源。
内容的提问来源于stack exchange,提问作者Reece Russell
相关产品推荐
相关产品推荐

