c# - 为什么执行策略 'SqlServerRetryingExecutionStrategy'不支持用户发起的交易?

标签 c# .net sql-server .net-core

执行策略“SqlServerRetryingExecutionStrategy”不支持用户启动的事务。使用返回的执行策略

您好,完整错误如下所示:

配置的执行策略'SqlServerRetryingExecutionStrategy' 不支持用户发起的交易。使用“DbContext.Database.CreateExecutionStrategy()”返回的执行策略将事务中的所有操作作为可重试单元执行。

这是我在一个函数中两次使用执行策略的代码: 这是在顶部

using(var posDbCtx = new PosDbContext())
                        {
                            var strategy = posDbCtx.Database.CreateExecutionStrategy();

                            strategy.Execute(
                            () =>
                            {
                                using (var transaction = posDbCtx.Database.BeginTransaction())
                                {
                                    _posDbContext.PrintJobs.Add(_printJobs);
                                    _posDbContext.SaveChanges();

                                    transaction.Commit();
                                }
                            });
                        }

这是代码之后:

using (var posDbCtx = new PosDbContext())
                    {
                        var strategy = posDbCtx.Database.CreateExecutionStrategy();

                        strategy.Execute(
                        () =>
                        {

                            using (var transaction = posDbCtx.Database.BeginTransaction())
                            {
                                int lineindex = 0;
                                foreach (var jline in _printjoblines)
                                {
                                    var pjobline = new PrintJobLine();
                                    pjobline.PrintLineId = Guid.NewGuid();
                                    pjobline.PrintJobId = jline.PrintJobId;
                                    pjobline.LineIndex = lineindex;
                                    pjobline.Text = jline.Text;
                                    pjobline.RightText = jline.RightText;
                                    pjobline.LeftText = jline.LeftText;
                                    pjobline.LineLength = jline.LineLength;
                                    pjobline.PrintOptions = jline.PrintOptions;
                                    pjobline.ItemName = jline.ItemName;
                                    pjobline.Quantity = jline.Quantity;
                                    pjobline.Flags = jline.Flags;
                                    pjobline.BergPlu = jline.BergPlu;
                                    pjobline.ActualPrice = jline.ActualPrice;
                                    pjobline.BasePrice = jline.BasePrice;
                                    pjobline.Vducolor = jline.Vducolor;
                                    pjobline.ParentIndex = jline.ParentIndex;
                                    pjobline.Peplu = jline.Peplu;
                                    pjobline.SaleItemId = jline.SaleItemId;
                                    pjobline.SaleTenderId = jline.SaleTenderId;
                                    pjobline.SignatureId = jline.SignatureId;
                                    //pjobline.Language = 0;
                                    _posDbContext.PrintJobLines.Add(pjobline);
                                    _posDbContext.SaveChanges();

                                    lineindex++;   
                                    
                                }

                                transaction.Commit();
                            }
                        });
                    }

我在本地即时通讯中使用 SQL Server 2019 最新版本 15.0.18386.0 执行此操作的解释 我部署它的数据库版本是 SQL Server 2014 版本 12.0.6164.21

我认为由于版本原因,它给出此错误的原因是否还有另一个针对旧版本 SQL Server 2014 修改上述代码以便能够在没有错误的情况下运行它?

最佳答案

问题在于您的 EF Core 配置,而不是您正在使用的 SQL Server 版本。当您在 UseSqlServer 配置方法中添加 EnableRetryOnFailure 时,需要在数据库范围内处理显式事务。

这是因为当数据库修改调用失败时,EF Core 不知道是否存在副作用以及该调用是否可以安全地自动重试。

当使用执行策略执行代码时,整个主体都会被重试。这意味着显式事务将通过任何错误处理进行回滚(或者只是使用超出范围并在处置时回滚显式事务),然后重试整个 block 。

它确保数据库的一致性并且始终尊重显式事务。对于隐式事务,失败的数据库修改调用会在重试之前回滚。

关于c# - 为什么执行策略 'SqlServerRetryingExecutionStrategy'不支持用户发起的交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68907419/

相关文章:

c# - 无法加载指定的元数据资源 Release vs Debug 构建

c# - 在 Entity Framework 中调用存储过程时的字符串准备

c# - 将数组中的值与数组中之前的所有值进行比较的有效方法

.net - 使用不兼容的 Visual Studio 进行调试,但使用 .pdb

c# - 如何在 Win7 和 Win8 上访问存储的凭据(PasswordVault?)?

sql - 需要帮助调整涉及表连接的 SQL 查询

c# - 使用 C# 和 asp.net 将 CSV 文件导入 SQL

sql-server - 默认日期时间值应该是多少?

c# - SalesForce 查询方法不返回可用数据

c# - 如何在不破坏应用程序引用的情况下从部署项目中重新定位程序集?