【问题标题】:Pass current transaction or use DependentClone?通过当前事务还是使用 DependentClone?
【发布时间】:2009-06-24 20:40:47
【问题描述】:

我有一个使用 SqlServer CE 3.5 作为数据库的 WinForm 应用程序。我使用类型化的数据集查询进行数据库操作。我需要为此操作使用事务。问题是,它们分散在不同的程序集中。我的问题是,我应该用什么来在一个事务中运行所有这些?这是一个示例操作:

//transaction should start here
this.QueryDb();
MyOtherAssembly.myClass.QueryDbForSomethingElse();
System.IO.File.Delete(fileName);
//end transaction

我正在考虑使用TransactionScope,但在这种情况下它会起作用吗?我的意思是如果File.Delete() 失败,QueryDbForSomethingElse() 会回滚吗?我应该将Transaction.CurrentTransaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete) 作为参数传递给它并使用传递的参数在那里创建一个新事务吗?

我将不胜感激。

【问题讨论】:

    标签: .net winforms transactions sql-server-ce strongly-typed-dataset


    【解决方案1】:

    TransactionScope 跨程序集工作 - 它真的不关心代码的实现位置。相反,它与当前执行上下文相关联(如果我没记错的话,就是当前线程)。

    但是,Windows 文件系统不是事务性的,因此无论您如何尝试将代码注册到事务中,文件操作都不会参与其中。在我们获得事务文件系统之前,如果涉及文件操作,您无法编写保证 ACID 事务的应用程序。

    相反,您必须明确实施补偿操作。

    不过,FWIW,您可能想看看 Juval Lowy 的 MSDN 杂志文章 Can't Commit? Volatile Resource Managers in .NET Bring Transactions to the Common Type

    【讨论】:

    • 谢谢。我应该更清楚并补充说我不需要删除事务文件,而且我的操作不是多线程的..
    猜你喜欢
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多