diff --git a/AssetManager.Infrastructure/Services/MarketDataService.cs b/AssetManager.Infrastructure/Services/MarketDataService.cs index 7e03aa2..c84b5a0 100755 --- a/AssetManager.Infrastructure/Services/MarketDataService.cs +++ b/AssetManager.Infrastructure/Services/MarketDataService.cs @@ -27,6 +27,9 @@ public class MarketDataService : IMarketDataService // 静态 pending 请求字典(跨请求共享,防止并发请求同一股票) private static readonly ConcurrentDictionary>> _pendingPriceRequests = new(); + + // 静态写入锁(串行化数据库写入) + private static readonly SemaphoreSlim _writeLock = new(1, 1); public MarketDataService( ILogger logger, @@ -200,9 +203,10 @@ public class MarketDataService : IMarketDataService ExpiredAt = expireAt }, expireAt); - // 写入数据库缓存(Fire-and-Forget,失败不影响主流程) + // 写入数据库缓存(串行化,避免连接冲突) _ = Task.Run(async () => { + await _writeLock.WaitAsync(); try { await SavePriceCacheAsync(symbol, assetType, response, source); @@ -211,6 +215,10 @@ public class MarketDataService : IMarketDataService { _logger.LogWarning(ex, "[数据库缓存写入失败] Symbol={Symbol},忽略(内存缓存已生效)", symbol); } + finally + { + _writeLock.Release(); + } }); return response;