【发布时间】:2011-06-03 15:29:48
【问题描述】:
我们曾经将DAAB 用于一些遗留业务对象,现在我们决定将TransactionScope 用于一些新业务对象。现在我们必须在旧业务对象代码中调用新业务对象。当在其中调用新业务对象时,旧业务对象代码将如下所示:
Database db = DatabaseFactory.CreateDatabase();
// create connection instance
DbConnection dbConnection = db.CreateConnection();
dbConnection.Open(); // open connection
// create transaction instance & start the transaction
DbTransaction dbTransaction = dbConnection.BeginTransaction();
// do some old business object insert/update
// now call the new business object
newBO.Update();
// commit transaction
dbTransaction.Commit();
新业务对象的代码如下:
using (TransactionScope scope = new TransactionScope())
{
// do some update/insert
scope.Complete();
}
问题是,这行得通吗?
我目前的信念是它将基于:
- 这个MSDN article 表示如果事务是在在范围之外创建的,那么事务的创建者仍然负责提交/回滚它——这基本上是我的情况,它会起作用如果这是真的,那就完美了。
- 我完成的 TransactionScope 的部分跟踪还表明,在处置 TransactionScope 时不一定会提交提交,但我无法完全完成跟踪,因此我不能 100% 确定我的跟踪是否准确
但是,有一些关于 TransactionScope 的文章,包括 this post on SO,其中没有提到这种情况,只是说事务将被回滚,而没有指定事务是否由 TransactionScope 本身创建。
所以我的问题是:根据您的经验,情况如何?
a) 在 TransactionScope 之外创建的事务在处置范围时提交
或
b) 在 TransactionScope 之外创建的事务在处置时未提交,创建者必须负责回滚和提交?
【问题讨论】:
-
您可以自己轻松地测试这个和场景的变体。
标签: c# .net transactions transactionscope