gpt4 book ai didi

c# - TransactionScope 和 Entity Framework

转载 作者:太空宇宙 更新时间:2023-11-03 15:42:53 25 4
gpt4 key购买 nike

我需要围绕 TransactionScope 包装一些代码。此 using 语句中的代码调用托管 C++ 库,该库将调用一些非托管代码。我也想更新我的数据库,它正在使用 Entity Framework。

问题来了,当在 TransactionScope 内的 DbContext 上执行 SaveChanges 时,我总是在数据库层遇到某种超时异常.我用谷歌搜索了这个,这似乎是一个相当普遍的问题,但我还没有找到任何适用于我的问题的答案。这是我的代码片段

using (var transactionScope = new TransactionScope())
{
try
{
//Do call to the managed C++ Library
using (var dbContext = _dbContextFactory.Create())
{
//doing some CRUD Operations on the DbContext
//Probably some more dbContext related stuff

dbContext.SaveChanges(); //Results with a timeout
}
}
catch (Exception)
{
transactionScope.Dispose();
throw;
}
}

我使用的是 Entity Framework 6.1.3,因此我可以访问数据库上的 BeginTransaction,但我还需要将 C++ 调用包装在 TransactionScope 中。

有什么建议吗?

最佳答案

您需要传入 TransactionScopeOptions 来定义您的超时(保持事务打开的时间)。超时绝对上限的示例是:

            TransactionOptions to = new TransactionOptions();
to.IsolationLevel = IsolationLevel.ReadCommitted;
to.Timeout = TransactionManager.MaximumTimeout;
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, to)) { }

您绝对应该意识到这种长时间运行的事务的影响,这通常不是必需的,我强烈建议您使用低于 MaximumTimeout 的值,这反射(reflect)了您期望它运行多长时间。您应该尽可能地保持事务持有的时间段尽可能小,在事务范围之外进行任何不必是单个事务的处理。

还值得注意的是,根据底层数据库,如果配置为这样做,它可以强制执行自己的事务持续时间限制。

关于c# - TransactionScope 和 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29507602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com