gpt4 book ai didi

c# - 无法访问已处置的对象。交易

转载 作者:太空狗 更新时间:2023-10-30 00:29:02 26 4
gpt4 key购买 nike

我们正在使用 Entity Framework 并在事务范围内运行单元测试。我们最初在标题中遇到错误。

我已经设法将问题隔离开来。

using (TransactionScope scope1 = new TransactionScope())
{
using (TransactionScope scope2 = new TransactionScope())
{
// Here there is no code
}

using (Entities se = new Entities())
{
EntityConnection entityConnection = (EntityConnection)se.Connection;
DbConnection storeConnection = entityConnection.StoreConnection;

storeConnection.Open(); // On this line the error occurs

// Some code that runs a stored procedure
}
}

我们当前收到的错误是“该操作对交易状态无效..”

如果我删除事务 scope2,一切正常。

如果我将范围 2 标记为环境事务,它也可以正常工作。

最佳答案

您正在创建没有显式 TransactionScopeOption 参数的 scope2,这会产生默认值 TransactionScopeOption.Required,请参阅 TransactionScope Constructor 中的 Remarks 部分

This constructor creates a new transaction scope with the transaction scope option equal to Required. This means that a transaction is required by the new scope and the ambient transaction is used if one already exists. Otherwise, it creates a new transaction before entering the scope.

在您的示例中,环境 TransactionScope 确实已经存在 (scope1),因此新的嵌套 TransactionScope (scope2) 与隐式参数 TransactionScopeOption.Required 正在使用现有的环境事务而不是创建一个新的事务本身。

但是,scope2 的隐式事务语义仍然存在,因此 scope1 创建的现有环境事务正在中止,因为您没有调用 Completescope2 的末尾:

Failing to call this method aborts the transaction, because the transaction manager interprets this as a system failure, or equivalent to an exception thrown within the scope of transaction

当然,如果您删除 scope2 或将其语义更改为 TransactionScopeOption.RequiresNew(意思是 “始终为范围。'),因为 scope1 创建的现有环境事务将不再受到影响。

参见 Implementing an Implicit Transaction using Transaction Scope有关这方面的更多详细信息。

关于c# - 无法访问已处置的对象。交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1327466/

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