如何使用linq将事务我的代码启用到SQL?

时间:2010-06-29 12:22:30

标签: c# visual-studio visual-studio-2008 linq linq-to-sql

如果写下面的代码:错误返回。我喜欢建议:
http://stackoverflow.com/questions/794364/how-do-i-use-transactionscope-in​​-c
但只有错误更改:合作伙伴事务管理器已禁用其对远程/网络事务的支持来自HRESULT的异常:0x8004D025  

我正在使用Windows Server 2003.


 using (var stockMovementCtx = new StockMovementCtxDataContext())
            {
                using (var scope = new TransactionScope())
                {

// do something....
}
scope.Complete();
}

但如果我改变了我的代码;一切都很好:


using (var stockMovementCtx = new StockMovementCtxDataContext())
            {


// do something....

}

我如何解决以下错误。这非常重要。请帮帮我:(((

2 个答案:

答案 0 :(得分:3)

如有必要,

TransactionScope会提升为DTC。听起来DTC配置不正确,通常是由于防火墙的限制。在服务器之间尝试dtcping(重要:在两个方向)。

答案 1 :(得分:1)

默认情况下,

DataContext将所有操作包装在Transaction内,因此在使用DataContext时不需要显式执行Transaction。阅读this

http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.aspx

using (var stockMovementCtx = new StockMovementCtxDataContext())
{
     // do something....


     //everything until this point is within the transaction.
     stockMovementCtx.SubmitChange();
}
  

为什么我们需要TransactionScope?

TransactionScope使您可以执行dataabse之外的事务。假设您有一系列操作,如下所示,并且都是原子操作,需要在事务中执行。

1。)在表1中添加记录 2.)在表2中添加记录 3.)在磁盘上写一个新文件
4.)重命名磁盘上的文件X
5.)表3中的更新文件记录

如果使用SqlTransaction,则只有操作1,3和5可以参与事务,但3和4不能,因为它们根本不涉及数据库。在这种情况下,TrasanctionScope可以帮助您。 TransactionScope利用MSDTC(Distributed Trasanction协调​​器),可以帮助您进行数据库上下文之外的事务。您可以在TransactionScope事务中包装所有五个操作,以原子方式执行它们。值得注意的是,TransactionScope支持嵌套事务,这意味着一个事务块可以包含多组事务。