ASP.NET Core连接Firebird数据库时更新/删除请求异常排查求助
基于Firebird 2.5数据库开发WPF/.NET Framework 4.7.2桌面应用,配套ASP.NET Core 2.2 API部署在IIS服务器,最多20台移动设备通过HTTP/JSON调用该API。
依赖组件版本
- FirebirdSql.Data.FirebirdClient 7.1.1
- FirebirdSql.EntityFrameworkCore.Firebird 7.1.1
- Microsoft.EntityFrameworkCore 2.2.4
异常现象
偶尔出现所有更新/删除请求失效的情况,抛出如下异常(查询请求仍可正常工作):
---------- MAIN EXCEPTION --------------- Typ wyjątku: Microsoft.EntityFrameworkCore.DbUpdateException Wiadomosć błędu: An error occurred while updating the entries. See the inner exception for details. TargetSite: Void Execute(Microsoft.EntityFrameworkCore.Storage.IRelationalConnection) Source: Microsoft.EntityFrameworkCore.Relational HResult: -2146233088 StackTrace: at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection) at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(DbContext _, ValueTuple`2 parameters) at Microsoft.EntityFrameworkCore.Storage.Internal.NoopExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded) at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable`1 commandBatches, IRelationalConnection connection) at Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IReadOnlyList`1 entries) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IReadOnlyList`1 entriesToSave) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess) at Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess) ---------- INNER EXCEPTION --------------- Typ wyjątku: FirebirdSql.Data.FirebirdClient.FbException Wiadomosć błędu: Dynamic SQL Error SQL error code = -206 Column unknown P0 At line 2, column 10 TargetSite: FirebirdSql.Data.FirebirdClient.FbDataReader ExecuteReader(System.Data.CommandBehavior) Source: FirebirdSql.Data.FirebirdClient HResult: -2147467259 StackTrace: at FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.Common.DbCommand.ExecuteReader() at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary`2 parameterValues) at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues) at Microsoft.EntityFrameworkCore.Update.ReaderModificationCommandBatch.Execute(IRelationalConnection connection) ------------ INNER EXCEPTION ------------ Typ wyjątku: FirebirdSql.Data.Common.IscException Wiadomosć błędu: Dynamic SQL Error SQL error code = -206 Column unknown P0 At line 2, column 10 TargetSite: Void ProcessResponse(FirebirdSql.Data.Client.Managed.IResponse) Source: FirebirdSql.Data.FirebirdClient HResult: -2146233088 StackTrace: at FirebirdSql.Data.Client.Managed.Version10.GdsDatabase.ProcessResponse(IResponse response) at FirebirdSql.Data.Client.Managed.Version10.GdsDatabase.ReadResponse[TResponse]() at FirebirdSql.Data.Client.Managed.Version11.GdsStatement.Prepare(String commandText) at FirebirdSql.Data.FirebirdClient.FbCommand.Prepare(Boolean returnsSet) at FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteCommand(CommandBehavior behavior, Boolean returnsSet) at FirebirdSql.Data.FirebirdClient.FbCommand.ExecuteReader(CommandBehavior behavior)
异常触发后,所有更新/删除请求持续失败,重启网站后恢复正常,问题每日出现0至数次。
复现关联信息
开发环境复现时,异常出现前会伴随以下错误:
Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded.
An error occurred while updating the entries. See the inner exception for details.
invalid request BLR at offset 55
undefined parameter number
An error occurred while updating the entries. See the inner exception for details.
lock conflict on no wait transaction
deadlock update conflicts with concurrent update
concurrent transaction number is 5863195
可通过并发执行相同请求复现问题;客户环境存在两种场景:编辑同表不同行,或单设备同时发送两次请求更新同一数据(后台线程+用户线程)。
代码实现模式
所有查询与更新均采用以下写法:
using (var db = new DbContext(connectionString)) { // 执行数据修改操作 db.SaveChanges(); }
问题根源分析
EF Core批量更新与Firebird驱动的兼容性bug
核心异常SQL error code = -206 Column unknown P0显示EF生成的动态SQL引用了未定义的参数P0,结合后续所有更新失效的现象,大概率是EF Core的ReaderModificationCommandBatch在并发场景下批量处理更新命令时出现参数绑定错乱。Firebird驱动7.1.1与EF Core 2.2.4的组合存在已知的并发参数绑定问题,会导致数据库连接池中的连接处于异常状态,后续更新请求复用该连接时全部失败。并发冲突未正确处理导致连接池污染
开发环境中出现的lock conflict、deadlock等异常,说明并发场景下事务未正确处理失败情况。若异常发生时连接未被正确释放或重置,连接池中的连接会携带错误状态(比如未完成的事务、错乱的参数上下文),后续请求复用这些连接时就会触发Column unknown这类异常。缺失瞬态异常重试策略
当前代码使用NoopExecutionStrategy(无重试策略),Firebird出现死锁、锁冲突等瞬态异常时直接抛出,未进行重试或连接清理,容易导致连接状态异常并污染连接池。
解决方案建议
- 升级依赖版本:EF Core 2.2已停止维护,建议升级到EF Core 3.1及以上稳定版本,同步升级Firebird相关驱动到对应兼容版本,修复已知的参数绑定和并发bug。
- 配置瞬态异常重试策略:针对Firebird配置EF Core重试策略,处理死锁、锁冲突等异常,避免连接池污染。示例代码:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseFirebird(connectionString) .EnableRetryOnFailure( maxRetryCount: 3, maxRetryDelay: TimeSpan.FromSeconds(1), errorNumbersToAdd: new[] { 335544344 } // Firebird死锁错误码 ); } - 确保连接正确释放:检查
using块使用规范,确保DbContext在任何异常场景下都能被正确释放,避免连接池中的连接处于异常状态。 - 业务层控制并发更新:添加乐观锁(如版本号字段),或限制同一数据的并发更新请求,减少锁冲突和死锁的发生。
- 临时禁用批量更新:若暂时无法升级依赖,可尝试禁用EF Core批量更新功能,强制每次
SaveChanges只处理单条命令,规避批量参数绑定问题。可通过自定义更新SQL生成器或拆分变更条目实现。
内容的提问来源于stack exchange,提问作者pejoter

