[英]Execution strategy 'SqlServerRetryingExecutionStrategy' does not support user-initiated transactions
[英]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.