如果编写以下代码:返回错误。我确实喜欢建议:
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....
}
如何解决上述错误?
TransactionScope
将提升为 DTC。听起来 DTC 未正确配置,通常是由于防火墙限制。尝试在服务器之间进行dtcping(重要:在两个方向)。
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 支持嵌套事务,这意味着一个事务块可以包含多组事务。