TransactionScope以错误的顺序回滚

时间:2013-09-19 07:05:51

标签: c# transactions rollback

我在我的应用程序中使用TransactionScope类,因为我需要自然地执行一些操作(所有这些操作都成功或者没有)。

由于此操作不仅与数据库相关,因此我通过实现IEnlistmentNotification接口为磁盘和系统服务操作(例如事务文件移动和服务停止)定义了自己的事务行为。它的工作正常,毫无疑问,但是当我把所有这些东西放在一个应用程序中时,我得到了意想不到的结果。

想象一下以下情况

using(var ts = ...)
{
    TxServiceManager.StopServices(services);
    TxFileManager.MoveFiles(files);
    DbManager.RunChangeScripts(scripts);
    TxServiceManager.StartServices(services);
    ts.Complete();
}

工作得很好,直到我遇到需要回滚所有操作的情况。它在启动服务时发生,我想,事务范围将

  1. 停止设法启动的服务
  2. 回滚数据库
  3. 恢复文件
  4. 启动服务
  5. 但是猜怎么着?它简单地从代码清单中的第一个操作开始,即服务停止,当然通过启动服务回滚。好的,服务正在运行,然后在第二次操作时失败,因为我无法覆盖这些服务运行时使用的文件。

    如何从第一个操作开始回滚而不是最后一个操作?

1 个答案:

答案 0 :(得分:3)

因为简单(来自MSDN):

  

您应该知道,可能无法按顺序或按特定顺序发送通知。

订单未定义。