在我们的应用程序中,在保存操作期间,我们是大约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();
}
提前致谢
答案 0 :(得分:0)
TransactionScope可以与多个DataContexts一起使用,但是很快就可以使用 由于涉及多个连接,因此事务会升级 到MSDTC / XA /分布式事务。要做到这一点你需要 让MSDTC在运行代码的系统和运行的系统上运行 数据库服务器。
或者,您可以避免升级到分布式事务 如果在transactionscope中创建显式连接并且 把它传递给你的datacontexts;这样TransactionScope就不会 升级到分布式事务,不依赖于MSDTC ......