使用TransactionScope中止事务

时间:2011-08-05 15:44:12

标签: linq-to-sql

在我们的应用程序中,在保存操作期间,我们是大约15个子表的数据。发生某些错误时,表中的数据存在差异。所以我们决定使用TransactionScope。当我们使用它时会出现错误,说“事务已中止”,StackTrace显示如下。

 at System.Transactions.TransactionStateAborted.BeginCommit(InternalTransaction tx, Boolean asyncCommit, AsyncCallback asyncCallback, Object asyncState)
   at System.Transactions.CommittableTransaction.Commit()
   at System.Transactions.TransactionScope.InternalDispose()
   at System.Transactions.TransactionScope.Dispose()

我们的代码看起来像

using (TransactionScope tScope = new TransactionScope())
                {
                    dataManager.AddFood(food);
                    if (!ModelState.IsValid)
                        throw new ApplicationException("Model state is invalid");
                    if (beingCloned)
                        food.IsUserFood = false;



                dataManager.Save();
                if (!food.IsUserFood)
                    dataManager.GenerateSearchRecords(food.FoodID);

                FoodManager foodManager = new FoodManager();
                foodManager.CopyFoodToHistory(food);

                if (beingCloned)
                {
                    foodManager.CreateUserFoodCopyForClonedFood(food);
                    HttpPostedFileBase file = ControllerContext.HttpContext.Request.Files["Image"];

                    if (file != null && file.FileName.Length > 0)
                        foodManager.UpdateMediaCopyForClonedFood(food, true);
                    else
                        foodManager.UpdateMediaCopyForClonedFood(food);
                }
                tScope.Complete();
            }

提前致谢

1 个答案:

答案 0 :(得分:0)

  

TransactionScope可以与多个DataContexts一起使用,但是很快就可以使用   由于涉及多个连接,因此事务会升级   到MSDTC / XA /分布式事务。要做到这一点你需要   让MSDTC在运行代码的系统和运行的系统上运行   数据库服务器。

     

或者,您可以避免升级到分布式事务   如果在transactionscope中创建显式连接并且   把它传递给你的datacontexts;这样TransactionScope就不会   升级到分布式事务,不依赖于MSDTC ......

https://stackoverflow.com/a/1592133/102937