繁体   English   中英

为什么执行策略“SqlServerRetryingExecutionStrategy”不支持用户发起的事务?

[英]why execution strategy 'SqlServerRetryingExecutionStrategy' does not support user initiated transactions?

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

你好,完整错误是这样说的:

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

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

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 在我的本地 im 上执行此操作的解释以及我部署它的数据库版本是 SQL Server 2014 版本 12.0.6164.21

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

问题是您的 EF Core 配置,而不是您使用的 SQL 服务器的版本。 UseSqlServer配置方法中添加EnableRetryOnFailure时,需要在数据库scope中处理显式事务。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM