【问题标题】:Glimpse with TransactionScope(), but #Transactions is 0用 TransactionScope() 一瞥,但 #Transactions 为 0
【发布时间】:2014-06-16 12:54:01
【问题描述】:

我正在像这样使用 TransactionScope:

var efConnectionString = ConfigurationManager.ConnectionStrings["MainDbContext"].ConnectionString;

var transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted;
using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
    using (var conn = new EntityConnection(efConnectionString))
    {
        conn.Open();

        using (var context = new MainDbContext(conn, false))
        {

            // here are some actions, including EF data querying and modifications, and also context.Database.ExecuteSqlCommand();

            context.SaveChanges();
        }
    }

    scope.Complete();
}

当我在 Glimpse 控制台中查看时,事务计数为 0。如果我检查数据库,我可以看到事务已经发生并提交。难道我做错了什么?如何查看正确的交易数量?

EDIT1:

MainDbContext 连接字符串:

<add name="MainDbContext" connectionString="metadata=res://*/EF.EfDataModel.csdl|res://*/EF.EfDataModel.ss‌​dl|res://*/EF.EfDataModel.msl;provider=Oracle.DataAccess.Client;provider connection string=&quot;data source=SERVER;password=PASS;persist security info=True;user id=USER&quot;" providerName="System.Data.EntityClient" />

【问题讨论】:

  • 您的连接字符串是什么样的?为什么要在DbContext 周围包裹EntityConnection
  • 我添加了连接字符串。我正在使用 EntityConnection,因为我只需要 1 个连接,我需要将它传递给 DbContext。更多信息在这里msdn.microsoft.com/en-us/data/dn456843.aspx和这里stackoverflow.com/questions/6860979/dapper-transactionscope
  • 我以为你在使用 EF。 EF 在上下文的数据库属性上提供了一种事务机制。 DbContext.Database.BeginTransaction(IsolationLevel.ReadCommitted);。这不是你想要的吗?您正在使用调用创建事务,而不是从其他地方获取它,因此不使用 EF 已经提供的内容没有多大意义。 EF 还将所有SaveChanges() 调用包装在一个事务中。
  • 是的,我正在使用 EF。但是,我有 Oracle 数据库。因此,EF6 不是一个选项,我需要使用 EF5。 DbContext.Database.BeginTransaction 在 EF6 中不可用。另外,我需要执行一些不能包含在 EF 事务中的纯 SQL 更新语句。这就是我用 TransactionScope 包装所有内容的原因。
  • 它不应该是必需的,因为 EntityConnection 应该使用 DbProviderFactories,但是您是否尝试将 EntityConnection 包装在 new GlimpseDbConnection(new EntityConnection(efConnectionString)) 中?我在使用 Oracle db 时总是遇到问题。

标签: c# entity-framework transactionscope glimpse


【解决方案1】:

您在 Glimpse SQL 统计信息和每个已执行查询的详细信息中看不到任何事务的原因是因为您使用的分布式事务未被考虑在内。

如果要查看交易数量,则必须在GlimpseDbConnection 上使用BeginDbTransaction 方法。

这就是 Glimpse 跟踪新事务开始的方式,它知道何时在从 @987654327 返回的 DbTransaction(即 GlimpseDbTransaction)上调用 CommitRollback 时结束GlimpseDbConnection上的@方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多