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

JL.*_*JL. 6 .net

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

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

例如

让我们说我想执行以下操作:

  1. 创建一个文件夹
  2. 在此文件夹中创建一个文件
  3. 执行一些其他misc任务,例如编辑reg键,或者你可以想到的可以回滚的实际操作.

现在,如果出现问题,我需要手动实现回滚策略,那么可能有一种方法可以使用oob .net功能将这些工作项作为事务进行管理?

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

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

谢谢,如果你知道这样的事情?

Mat*_*ton 5

您可以使用TransactionScope类来开始事务,但是您在该事务中执行的任何操作都必须是"事务感知",并知道如何回滚事务.

Brent VanderMeide在dnrTV上做了两部分关于如何编写了解TransactionScope的课程的系列文章.这是第1部分,这是第2部分.


Big*_*ian 0

通常,这种意义上的事务意味着数据库 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();
    }
} 
Run Code Online (Sandbox Code Playgroud)