.net,你得到一个交易对象吗?

时间:2010-03-31 21:08:09

标签: .net

使用SQL / ADO,让我思考一些我认为逻辑上应该包含在.net框架中的内容,我想知道这样的事情是否存在,让我解释一下。

是否存在一个基本上是事务管理器的对象,您将命令(工作项)传递给同一个我认为有必要也为事务中的每个工作项传递回滚操作。

例如

假设我想执行以下操作:

  1. 创建文件夹
  2. 在此文件夹中创建文件
  3. 执行其他一些misc任务,例如编辑注册表项,或者您可以想到的可以回滚的实际操作。
  4. 现在,如果出现问题,我需要手动实施回滚策略,那么可能有一种方法可以使用oob .net功能将这些工作项作为事务进行管理吗?

    我的考虑因素是要求自动回滚项目,但能够手动控制每个工作项回滚期间发生的事情,这似乎很实用。

    另一件事是微软用LINQ做的事情非常棒,有效地使用SQL查询所有类型的东西,而不仅仅是SQL表。那么也许有一些LINQ的交易模型?

    谢谢你,如果你知道这样的话吗?

2 个答案:

答案 0 :(得分:5)

您可以使用TransactionScope类开始交易,但您在该交易中执行的任何操作都必须是“交易感知”,并且知道如何回滚交易。

Brent VanderMeide在dnrTV上编写了一个关于如何编写了解TransactionScope的类的系列文章。这是part 1,而这里是part 2

答案 1 :(得分:0)

通常,这种意义上的事务意味着DB IO,而不是文件系统操作。在ADO.Net 2.0中,您可以执行类似下面的代码。

对于其他类型的交易,我建议查看MS DTC(分布式事务协调器)。这将允许您的事务跨越不同的计算机,我也相信允许您登记要回滚的自定义操作。

我希望这会有所帮助。

using (SqlConnection connection =
            new SqlConnection(connectionString))
{
    SqlCommand command = connection.CreateCommand();
    SqlTransaction transaction = null;

    try
    {
        // BeginTransaction() Requires Open Connection
        connection.Open();

        transaction = connection.BeginTransaction();

        // Assign Transaction to Command
        command.Transaction = transaction;

        // Execute 1st Command
        command.CommandText = "Insert ...";
        command.ExecuteNonQuery();

        // Execute 2nd Command
        command.CommandText = "Update...";
        command.ExecuteNonQuery();

        transaction.Commit();
    }
    catch
    {
        transaction.Rollback();
        throw;
    }
    finally
    {
        connection.Close();
    }
}