【发布时间】:2013-04-23 20:39:02
【问题描述】:
据我所知,MSDTC 仅在以下情况下介入:
您正在查询链接到的事务中的视图/表 另一台服务器。
您正在使用两个 SqlConnection(或其他任何 NHibernate 使用)在单个 TransactionScope 中
您在 TransactionScope 中征用另一个事务组件(如 MSMQ 或事务文件系统)。
未提及的其他情况。
如果我禁用 MSDTC 并运行以下代码,我会收到(服务器“服务器”上的 MSDTC 不可用)错误。
public bool Add(PurchaseOrderInfo purchaseOrderInfo)
{
using (TransactionScope ts = new TransactionScope())
{
using (SqlConnection Cnn = new SqlConnection(SqlHelper.ConnStr))
{
Cnn.Open();
try
{
using (SqlDataReader rdr = SqlHelper.ExecuteReader(/*Tr*/Cnn, "spPurchaseOrderAdd", purchaseOrderInfo.ExpectedShipment.ShipmentID, purchaseOrderInfo.CreateDate, purchaseOrderInfo.CustomerNotes, purchaseOrderInfo.Status, purchaseOrderInfo.PurchaseOrderNumber))
{
if (rdr.Read())
FillPurchaseOrderInfo(rdr, ref purchaseOrderInfo, GettingDepthEnum.Level_0);
else
{
return false;
}
}
foreach (PurchaseOrderDetailInfo detailInfo in purchaseOrderInfo.Details)
{
throw new Exception("Test");
//if (!AddPurchaseOrderDetail(Tr, purchaseOrderInfo, detailInfo))
{
//Tr.Rollback();
return false;
}
}
return true;
}
catch (Exception ex)
{
throw ex;
}
ts.Complete();
}
}
}
我错过了什么吗?
更新: 存储过程包含一个简单的插入语句:
INSERT INTO tblPurchaseOrder
(ShipmentID, CreateDate, CustomerNotes, PurchaseOrderState, PurchaseOrderNumber, LastActivityDate)
VALUES
(@ShipmentID, @CreateDate, @CustomerNotes, @PurchaseOrderState, @PurchaseOrderNumber, GETDATE());
--Step 2: return row that INSERTED to Client Computer.
SELECT dbo.viwGetPurchaseOrderWeight.Weight,* FROM tblPurchaseOrder LEFT OUTER JOIN viwGetPurchaseOrderWeight ON viwGetPurchaseOrderWeight.PurchaseOrderID = tblPurchaseOrder.PurchaseOrderID WHERE (tblPurchaseOrder.PurchaseOrderID = Scope_Identity());
更新 2: 关闭MSDTC时,执行到此行时抛出异常:
using (SqlDataReader rdr = SqlHelper.ExecuteReader(/*Tr*/Cnn, "spPurchaseOrderAdd", purchaseOrderInfo.ExpectedShipment.ShipmentID, purchaseOrderInfo.CreateDate, purchaseOrderInfo.CustomerNotes, purchaseOrderInfo.Status, purchaseOrderInfo.PurchaseOrderNumber))
这意味着后面的行没有效果。
【问题讨论】:
-
你的进程在做什么?它们是否涉及链接服务器?
-
@DavidHoerster 我更新了问题以包含该过程。
-
您是否使用了第二个数据库连接?看起来不是这样,但我相信如果在
TransactionScope中引入第二个连接,那么事务就会被提升到 DTC。否则它应该留在本地。 -
@DavidHoerster 这正是让我感到困惑的地方!没有其他联系! SqlHelper 是 Microsoft.ApplicationBlocks.Data 程序集中的一个类,我不认为它是在内部打开连接!
-
发布精简的代码示例会更容易获得答案。尝试摆脱所有的调试问题。
标签: c# sql-server-2008 transactions msdtc