0

我有一个使用SqlServer CE 3.5作为数据库的WinForm应用程序。我使用类型化数据集查询进行数据库操作。我需要为此操作使用事务。问题是,它们分散在不同的程序集中。我的问题是,我应该如何在单个事务中运行它们?这里有一个示例操作:传递当前事务或使用DependentClone?

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

我在想使用TransactionScope,但它会在这种情况下工作吗?我的意思是QueryDbForSomethingElse()回滚,如果File.Delete()失败?我应该通过Transaction.Current还是Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete)作为参数,并使用传递的参数在那里创建新的事务?

我很感激这方面的任何想法。

回答

0

TransactionScope适用于程序集 - 它真的不在意其中代码实现。相反,它与当前的执行上下文绑定(当前线程,如果我没有弄错的话)。

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

相反,您将明确地必须实施补偿措施。

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

+0

谢谢。 我应该更清楚,并补充说我不需要事务性文件删除,我的操作不是多线程.. – dstr 2009-06-25 09:50:12