【问题标题】:Is there a way to use TransactionScope with an existing connection?有没有办法将 TransactionScope 与现有连接一起使用?
【发布时间】:2009-06-01 10:46:19
【问题描述】:

我有一些代码的工作方式类似于建议使用的 TransactionScope,但有一个环境连接而不是环境事务。

有没有办法将 TransactionScope 对象与现有连接一起使用,或者 .Net 框架中是否有用于此目的的替代方法?

【问题讨论】:

    标签: c# transactions transactionscope


    【解决方案1】:

    其实有一种方法。

    connection.EnlistTransaction(Transaction.Current)
    

    它可以工作,并且如果没有必要,它不会将事务推广到分布式(与文档所说的相反)

    HTH

    【讨论】:

    【解决方案2】:

    要将连接加入 TransactionScope,您需要在其连接字符串中指定 'Enlist=true',并在该 TransactionScope 对象的范围内打开连接。

    您可以在现有连接上使用SqlConnection.BeginTransaction

    更新:你能像这样使用BeginTransaction吗:

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
    
        SqlCommand command = connection.CreateCommand();
        SqlTransaction transaction;
    
        // Start a local transaction.
        transaction = connection.BeginTransaction("SampleTransaction");
    
        // Must assign both transaction object and connection
        // to Command object for a pending local transaction
        command.Connection = connection;
        command.Transaction = transaction;
    
        ...
        ...
    
    }
    

    【讨论】:

    • 问题是,连接是在TransactionScope实例化之前打开的;因此我提出问题的原因。
    • @Mitch,在任何情况下,connection.BeginTransaction("SampleTransaction") 都不会升级为分布式事务 (DTC) 吗?如果是,那么这些场景是什么?
    【解决方案3】:

    经过更多研究,我的问题的答案原来是:

    不可以,需要实例化TransactionScope对象后才能打开连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 2016-11-01
      • 1970-01-01
      相关资源
      最近更新 更多