如何使用 linqto SQL 启用事务处理我的代码?

问题描述 投票:0回答:2

如果编写以下代码:返回错误。我确实喜欢建议:
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....

}

如何解决上述错误?

c# visual-studio visual-studio-2008 linq linq-to-sql
2个回答
3
投票
如有必要,

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


1
投票
默认情况下,

DataContext
将所有操作包装在
Transaction
中,因此您在使用 DataContext 时无需显式执行 Transaction。阅读

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 使您能够执行数据库之外的事务。假设您有如下一系列操作,所有操作都是原子的,并且需要在事务中执行。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.