Browse Source

try to resolve dead lock between select top(1000) and update

Robert 1 year ago
parent
commit
4d5fd7ad8a

+ 1 - 0
EVCB_OCPP.TaskScheduler/EVCB_OCPP.TaskScheduler.csproj

@@ -21,6 +21,7 @@
     <PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
     <PackageReference Include="NLog.Extensions.Logging" Version="5.2.1" />
     <PackageReference Include="NLog.Web.AspNetCore" Version="5.2.1" />
+    <PackageReference Include="Polly" Version="7.2.3" />
     <PackageReference Include="Quartz.Extensions.Hosting" Version="3.6.0" />
     <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
     <PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />

+ 11 - 14
EVCB_OCPP.TaskScheduler/Services/DatabaseService.cs

@@ -4,11 +4,14 @@ using EVCB_OCPP.TaskScheduler.Models;
 using Microsoft.Data.SqlClient;
 using Microsoft.Extensions.Configuration;
 using Microsoft.Extensions.Logging;
+using Polly;
+using Polly.Retry;
 using System;
 using System.Collections.Generic;
 using System.Configuration;
 using System.Data;
 using System.Data.Common;
+using System.Diagnostics;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -210,21 +213,15 @@ namespace EVCB_OCPP.TaskScheduler.Services
             {
                 using (var dbConn = new SqlConnection(mainDBConnectString))
                 {
-                    await dbConn.OpenAsync();
-                    using (var trans = await dbConn.BeginTransactionAsync())
+                    foreach (var kv in reportResults)
                     {
-                        //dbConn.Open();
-
-                        foreach (var kv in reportResults)
-                        {
-                            var parameters = new DynamicParameters();
-                            parameters.Add("@Id", kv.Key, DbType.Int32, ParameterDirection.Input);
-                            parameters.Add("@StartTransactionReportedOn", kv.Value.StartTransactionReportedOn, DbType.DateTime, ParameterDirection.Input);
-                            parameters.Add("@ErrorMsg", kv.Value.ErrorMsg, DbType.String, ParameterDirection.Input, -1);
-                            await trans.ExecuteAsync("UPDATE [dbo].[TransactionRecord] set StartTransactionReportedOn=@StartTransactionReportedOn, ErrorMsg=@ErrorMsg  where Id=@Id", parameters);
-                        }
-
-                        await trans.CommitAsync();
+                        var parameters = new DynamicParameters();
+                        parameters.Add("@Id", kv.Key, DbType.Int32, ParameterDirection.Input);
+                        parameters.Add("@StartTransactionReportedOn", kv.Value.StartTransactionReportedOn, DbType.DateTime, ParameterDirection.Input);
+                        parameters.Add("@ErrorMsg", kv.Value.ErrorMsg, DbType.String, ParameterDirection.Input, -1);
+                        await Policy.Handle<Exception>()
+                            .WaitAndRetryForeverAsync((cnt) => TimeSpan.FromSeconds(5))
+                            .ExecuteAsync(() => dbConn.ExecuteAsync("UPDATE [dbo].[TransactionRecord] set StartTransactionReportedOn=@StartTransactionReportedOn, ErrorMsg=@ErrorMsg  where Id=@Id", parameters));
                     }
                 }
             }