【问题标题】:TransactionScope involving a DbTransaction created before entering a scopeTransactionScope 涉及在进入范围之前创建的 DbTransaction
【发布时间】: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();
}

问题是,这行得通吗?

我目前的信念是它将基于:

  1. 这个MSDN article 表示如果事务是在范围之外创建的,那么事务的创建者仍然负责提交/回滚它——这基本上是我的情况,它会起作用如果这是真的,那就完美了。
  2. 我完成的 TransactionScope 的部分跟踪还表明,在处置 TransactionScope 时不一定会提交提交,但我无法完全完成跟踪,因此我不能 100% 确定我的跟踪是否准确

但是,有一些关于 TransactionScope 的文章,包括 this post on SO,其中没有提到这种情况,只是说事务将被回滚,而没有指定事务是否由 TransactionScope 本身创建。

所以我的问题是:根据您的经验,情况如何?

a) 在 TransactionScope 之外创建的事务在处置范围时提交

b) 在 TransactionScope 之外创建的事务在处置时未提交,创建者必须负责回滚和提交?

【问题讨论】:

  • 您可以自己轻松地测试这个和场景的变体。

标签: c# .net transactions transactionscope


【解决方案1】:

答案是 B。但是,您需要记住,transactionScope 在分布式系统级别使用 MSDTC 创建事务,而在 DB 上创建 DB 事务

【讨论】:

  • 使用 TransactionScope 时,事务不一定提升到 MSDTC。
猜你喜欢
  • 1970-01-01
  • 2020-10-22
  • 2022-08-11
  • 2016-02-19
  • 1970-01-01
  • 2018-07-01
  • 2014-05-15
  • 2017-02-01
  • 1970-01-01
相关资源
最近更新 更多