如何通过两个不相关或解耦的方法调用“跨越”事务?

时间:2009-04-21 15:49:50

标签: c# .net sql transactions

我正忙于在C#,WinForms,.NET 3.5中构建一个软件更新应用程序,在那里我有一组带有公共基类的可插入任务类。我想要一个任务,数据库升级,开始一个事务,另一个任务,网站升级,提交或回滚同一个事务,所以网站和数据库总是同步。

我依稀记得我的VB6时代的东西,如果一个COM +方法已经在运行中就可以登记,或者如果没有,则开始一个,等等。我也有这种移植到.NET Enterprise Services的模糊记忆,但是不久前。

目前用于实现此目的的技术是什么?

3 个答案:

答案 0 :(得分:4)

我认为您正在寻找environment transactions, or implicit transactions

using (TransactionScope scope = new TransactionScope())
{
   // do several stuff in the same transaction
   // calls in here implicitly are in the scope of the transaction.
   // you open several independent connections, which are in the same transaction.
}

答案 1 :(得分:3)

你可能想从这里开始。

http://msdn.microsoft.com/en-us/library/86773566.aspx

SqlConnection.BeginTransaction返回一个SqlTransaction,它实现了IDbTransaction。

IDbTransaction上定义的两个方法是Commit()和Rollback()。如果在调用之间保持连接对象处于活动状态,您应该能够将事务从一个地方传递到另一个地方并在那里执行提交或回滚。

如果您不使用SQL Server,您的数据库提供程序(OleDb,Odbc等)将提供相应的对象。

答案 2 :(得分:1)

在我的头脑中,我认为你应该能够用特殊技术做到这一点。创建一个UpgradeManager类,负责启动数据库和Web升级。该事务应该在这里生效,并被调用围绕对其他两个对象的调用。

如果您要插入其他任务,请让UpgradeManager迭代您的任务集合。

.....或者你可以通过这个交易,就像harpo说的那样(他的反应来自于我的作曲)......很高兴有选择权。 ; - )

内特